微信小程序支付踩的坑(支付驗證簽名失敗)

微信小程序支付踩的坑(支付驗證簽名失敗)

最近有需求是微信小程序支付,用的是微信自帶的sdk,曾做過微信APP支付,微信掃用戶碼支付,都是OK的,現在把做微信小程序支付流程寫下來,還有在調用過程踩的坑,下面爲步驟

一.先查看API

地址: https://pay.weixin.qq.com/wiki/doc/api/index.html
官網API
我是後端的,前端調用是用我們返回的值
地址: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
在這裏插入圖片描述
查看api可以知道我們需要的值,其他的還好說,其中有一個需要特別注意一下:剛好小程序的trade_type就是JSAPI
在這裏插入圖片描述

二.查看流程圖

開始我以爲這個前端來傳就可以了,後來前端也說他只能獲得一個登錄code,於是我看了流程:
在這裏插入圖片描述

三.獲取openid

那就我們來獲取openid吧,後端還比較安全,於是我找到了這個地址:
地址: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
具體調用如下代碼:

//拼成get方式的請求體
String params = "appid=" + tParamPayment.getApp_id() + "&secret=" + tParamPayment.getPay_key() + "&js_code=" + authcode + "&grant_type="
                    + Consts.GRANT_TYPE;
String responseContent = WXPayRequest.sendGet(Consts.GET_OPENID_URL, params);
Map mSepRet = gson.fromJson(responseContent, Map.class);
logger.info("get openid:" + gson.toJson(mSepRet));
if (null == mSepRet.get("openid")) {
     //自定義錯誤
     return ResultUtil.error(PltResult.RESULT_PA36.getpCode(), PltResult.RESULT_PA36.getpName());
}
String openid = (String) mSepRet.get("openid");
//注:appid是小程序appid,祕鑰是小程序的appSecret
public static String GET_OPENID_URL = "https://api.weixin.qq.com/sns/jscode2session";//請求地址
public static String GRANT_TYPE = "authorization_code";//grant_type:固定的
四.調用統一下單接口(防坑)

放上微信的SDK,做了簡單改動,更貼近現實開發
鏈接:https://pan.baidu.com/s/1AEpdsXyVzcFvXXrOpJeFug
提取碼:9bif
然後我在調用接口的時候也發現是沒問題的,代碼如下:

Map<String, String> parameters = new HashMap<String, String>();
MyConfig config = new MyConfig(tParamPayment.getMerchant_key(), tParamPayment.getMerchant_id(), tParamPayment.getApp_id());
WXPay wxpay = new WXPay(config);
parameters.put("body", "根據實際情況填寫");// 商品詳情
parameters.put("nonce_str", WXPayUtil.generateNonceStr());
parameters.put("out_trade_no", "根據實際情況填寫" ); parameters.put("spbill_create_ip", "127.0.0.1");// 調用微信支付API的機器IP
parameters.put("total_fee", ordamt);// 總額
parameters.put("openid", openid);// 上面獲取的openid
parameters.put("notify_url", tParamPayment.getNotify_url());// 回調地址
parameters.put("trade_type", "JSAPI");// 類型
String sign = WXPayUtil.generateSignature(parameters, tParamPayment.getMerchant_key());
parameters.put("sign", sign);// 簽名
 logger.debug("wxpay request:" + gson.toJson(parameters));
Map<String, String> resXmlMap = wxpay.unifiedOrder(parameters);
logger.debug("wxpay response:" + gson.toJson(resXmlMap));
if (Consts.SUCCESS.equals(resXmlMap.get("return_code")) && Consts.OK.equals(resXmlMap.get("return_msg"))) {
    Map<String, String> payparamsMap = new HashMap<String, String>();
    Date currDate = new Date();
    long timestamp = currDate.getTime() / 1000;
    payparamsMap.put("appId", tParamPayment.getApp_id());
    payparamsMap.put("package", "prepay_id=" + resXmlMap.get("prepay_id"));
    payparamsMap.put("timeStamp", timestamp + "");
    payparamsMap.put("nonceStr", WXPayUtil.generateNonceStr());// 
    payparamsMap.put("signType", WXPayConstants.MD5);
    String newSign = WXPayUtil.generateSignature(payparamsMap, tParamPayment.getMerchant_key());
    payparamsMap.put("paySign", newSign);
    logger.debug("response data:" + gson.toJson(payparamsMap));
    returnParam.put("payparams", payparamsMap);
    //注:MyConfig config = new MyConfig("商戶祕鑰", "商戶id", "小程序appid");

}

值也得獲取了:下面這些值
在這裏插入圖片描述
然後小程序的同事告訴我簽名錯誤。
在這裏插入圖片描述
我們把獲取的值用MD5加密了一下,發現加密也是沒問題的,那真是很奇怪。
後來想到是不是在調用微信拿這些值的時候出了什麼錯,但是微信爲什麼能通過呢,這就是微信最大坑的地方了
wxpay.unifiedOrder(parameters)中的unifiedOrder方法
進去以後是這個
```
再點進去是這個
在這裏插入圖片描述
其中:注意行數
在這裏插入圖片描述
MD5用的是在沙箱環境下我們改一下
在這裏插入圖片描述
搞定把值返回給前端,可以調起微信支付
在這裏插入圖片描述
微信還是挺坑的,但是我們要自己提高適應,我看了好多網上的調用,改了好多都不行,也有傳加密方式的,我都試過不行,希望這個博文可以幫助還在微信小程序坑裏的人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章