微信支付(PC扫码支付和H5公众号支付)
生活随笔
收集整理的這篇文章主要介紹了
微信支付(PC扫码支付和H5公众号支付)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在做微信支付,微信支付比較坑,官方居然只有.NET、C#、PHP的demo居然沒有java的demo。然后微信支付是不提供測試賬號的需要直接用正式的公眾號。首先來介紹下微信掃碼支付吧,微信掃碼有兩種方式,這里采用第二種方式統一下單(JSAPI)。需要提前在微信公眾號后臺申請微信支付開通,具體的開通規則詳細文檔見點擊打開鏈接
其實微信支付挺簡單的無非就是拼裝參數給微信發送請求,要注意的幾點就是支付的金額是分,微信沒有同步回調地址,只有異步回調的地址。這樣的話就不能實時反饋支付結果到PC端頁面。網上大多數同步的做法就是通過ajax定時查詢訂單的狀態,(可以查詢自己業務訂單的支付狀態或者去調微信支付查詢接口微信給我們返回的訂單狀態)兩種都可以,lz建議還是去查詢微信服務那邊的訂單查詢接口。這樣可以緩解我們自己的服務器的壓力,也可以預防人家惡意刷我們的接口。京東也是采用定時輪詢查詢訂單的狀態的他們是每隔3s去查一次。
下面附上H5和PC掃碼支付的代碼這是H5和Pc下單的接口
package com.workit.pay.weixin.wxPay;
import java.util.Date; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import com.workit.comm.util.String.StringUtil; import com.workit.pay.weixin.wxPay.constant.WeiXinPayConstant; import com.workit.pay.weixin.wxPay.util.PayCommonUtil; import com.workit.pay.weixin.wxPay.util.WeixinFormatXmlProcess;/** * @Title: WxPayService.java *.qqwx.wxPay * @Description: TODO * * @date 2017年5月3日 上午11:16:48 * @version V1.0 */ public class WxPayService {private static final Logger logger = LoggerFactory.getLogger(WxPayService.class);public static String getOrderNo(){return "DD"+String.valueOf(new Date().getTime());}/*** * @Title: unifiedOrderPC* @Description: 微信PC 掃碼下單接口* @param @param body* @param @param orderNo* @param @param totalFee* @param @return* @param @throws Exception * @return String*/public static String unifiedOrderPC(String body,String orderNo, String totalFee) throws Exception{return unifiedOrder(body,orderNo, totalFee,null,WeiXinPayConstant.TRADE_TYPE_PC,null);}/*** * @Title: unifiedOrderH5* @Description: 微信H5 下單接口* @param @param body 商品描述* @param @param orderNo* @param @param totalFee* @param @param openId* @param @param ip* @param @return* @param @throws Exception * @return SortedMap<Object,Object>*/public static SortedMap<Object, Object> unifiedOrderH5(String body,String orderNo, String totalFee,String openId,String ip) throws Exception{String prepay_id = unifiedOrder(body,orderNo, totalFee,openId,WeiXinPayConstant.TRADE_TYPE_H5,ip);if(StringUtil.isNotEmpty(prepay_id)){SortedMap<Object, Object> payMap = new TreeMap<Object, Object>();payMap.put("appId",WeiXinPayConstant.APPID); payMap.put("timeStamp",PayCommonUtil.createTimestamp()); payMap.put("nonceStr",PayCommonUtil.CreateNoncestr()); payMap.put("signType","MD5"); payMap.put("package", "prepay_id="+prepay_id); String paySign = PayCommonUtil.createSign("UTF-8",payMap,WeiXinPayConstant.API_KEY);payMap.put("paySign", paySign); payMap.put("pg", prepay_id); return payMap;}else{return null;}}/*** * @Title: unifiedOrder* @Description: 微信支付掃碼和H5支付統一下單接口* @param @param body 商品描述* @param @param orderNo 訂單編號* @param @param totalFee 總金額單位分* @param @param openId H5必傳的參數* @param @param payType 支付終端* @param @param ip 請求IP* @param @return* @param @throws Exception * @return String */public static String unifiedOrder(String body,String orderNo, String totalFee,String openId,String payType,String ip) throws Exception{SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();String tradeType = "";String spbill_create_ip = "";if(WeiXinPayConstant.TRADE_TYPE_H5.equals(payType)){//H5支付tradeType = WeiXinPayConstant.TRADE_TYPE_H5;spbill_create_ip = ip;parameters.put("openid", openId);//用戶標識 openid 否 String(128) oUpF8uMuAJO_M2pxb1Q9zNjWeS6o trade_type=JSAPI時(即公眾號支付),此參數必傳,此參數為微信用戶在商戶對應appid下的唯一標識。openid如何獲取,可參考【獲取openid】。企業號請使用【企業號OAuth2.0接口】獲取企業號內成員userid,再調用【企業號userid轉openid接口】進行轉換 }else{spbill_create_ip = "10.20.20.64";tradeType = WeiXinPayConstant.TRADE_TYPE_PC;//PC掃碼支付parameters.put("product_id",orderNo);}parameters.put("appid", WeiXinPayConstant.APPID);//公眾賬號ID appid 是 String(32) wxd678efh567hg6787 微信支付分配的公眾賬號ID(企業號corpid即為此appId) parameters.put("body", body);//商品描述 body 是 String(128) 騰訊充值中心-QQ會員充值 商品簡單描述,該字段請按照規范傳遞,具體請見參數規定parameters.put("mch_id", WeiXinPayConstant.MCH_ID);//商戶號 mch_id 是 String(32) 1230000109 微信支付分配的商戶號 parameters.put("nonce_str",PayCommonUtil.CreateNoncestr());//隨機字符串 nonce_str 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 隨機字符串,長度要求在32位以內。推薦隨機數生成算法 parameters.put("out_trade_no",orderNo);//商戶訂單號 out_trade_no 是 String(32) 20150806125346 商戶系統內部訂單號,要求32個字符內,只能是數字、大小寫字母_-|*@ ,且在同一個商戶號下唯一。詳見商戶訂單號 parameters.put("spbill_create_ip",spbill_create_ip);//終端IP spbill_create_ip 是 String(16) 123.12.12.123 APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。 parameters.put("total_fee", totalFee);//標價金額 total_fee 是 Int 88 訂單總金額,單位為分,詳見支付金額 parameters.put("notify_url",WeiXinPayConstant.NOTIFY_URL);//通知地址 notify_url 是 String(256) http://www.weixin.qq.com/wxpay/pay.php 異步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數。 parameters.put("trade_type",tradeType);//交易類型 trade_type 是 String(16) JSAPI 取值如下:JSAPI,NATIVE,APP等,說明詳見參數規定 String sign = PayCommonUtil.createSign("UTF-8",parameters,WeiXinPayConstant.API_KEY);//簽名 sign 是 String(32) C380BEC2BFD727A4B6845133519F3AD6 通過簽名算法計算得出的簽名值,詳見簽名生成算法 parameters.put("sign", sign);String requestXML = PayCommonUtil.getRequestXml(parameters); //把參數打包轉成xml格式String result =PayCommonUtil.httpsRequest(WeiXinPayConstant.WEIXIN_PAY_URL,"POST",requestXML);//向微信發送統一下單請求Map<String, Object> mapResult = WeixinFormatXmlProcess.parseXml1(result); //微信響應的結果String resultCode =(String)mapResult.get("return_code");logger.info(mapResult.toString());if(WeiXinPayConstant.WX_PAY_SUCCESS_STATUS.equals(resultCode)){if(WeiXinPayConstant.TRADE_TYPE_H5.equals(payType)){//H5支付return (String)mapResult.get("prepay_id");}else{return (String)mapResult.get("code_url");}}else{return null;}}}轉載于:https://www.cnblogs.com/root429/p/9251332.html
總結
以上是生活随笔為你收集整理的微信支付(PC扫码支付和H5公众号支付)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据工程师简历_大数据工程师简历3份
- 下一篇: 盘点2021年10个顶级数据分析软件,及