其实微信支付并没有想象中那么复杂, 你只需要花点时间看下我这篇文章,相信你可以很快学会,废话少说,跟我来吧!
①小程序前端会通过调用wx.login接口获取得到登陆凭据code。这个code获取之后5分钟内如果再次调用wx.login获取code并传递给②就会报错,code非法,这个需要注意下。
② 小程序将code登陆凭据和orderId订单编号穿给后台服务端,服务端调用https://api.weixin.qq.com/sns/jscode2session接口,获取session_key和openId。
③ 服务端拿到openId以后,调用统一下单接口https://api.mch.weixin.qq.com/pay/unifiedorder,并将返回的xml转化为map,得到其中的一些支付需要的参数进行二次签名,并返回给小程序。
@Override
public JSONObject getSecondSign(Map<String, String> map) throws Exception {
String return_code = map.get("return_code");//返回状态码
String return_msg = map.get("return_msg");//返回信息
logger.debug("return_code:"+return_code+"------return_msg:" + return_msg);
JSONObject JsonObject=new JSONObject() ;
// 业务结果
if("SUCCESS".equals(return_code)){
String prepay_id = map.get("prepay_id");//返回的预付单信息
String nonceStr = RandomUtil.get32RandomStr();
JsonObject.put("nonceStr", nonceStr);
JsonObject.put("package", "prepay_id="+prepay_id);
Long timeStamp= System.currentTimeMillis()/1000;
JsonObject.put("timeStamp", timeStamp+"");
//再次签名
String appid = PayConstant.WX_APPID;
String stringSignTemp = "appId=" + appid
+ "&nonceStr=" + nonceStr
+ "&package=prepay_id=" + prepay_id
+ "&signType=MD5&timeStamp=" + timeStamp;
stringSignTemp = stringSignTemp + "&key=" + PayConstant.WX_MCHKEY;
String paySign = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
JsonObject.put("paySign", paySign);
}
return JsonObject;
}
String return_code = map.get("return_code");//返回状态码
String return_msg = map.get("return_msg");//返回信息
logger.debug("return_code:"+return_code+"------return_msg:" + return_msg);
JSONObject JsonObject=new JSONObject() ;
// 业务结果
if("SUCCESS".equals(return_code)){
String prepay_id = map.get("prepay_id");//返回的预付单信息
String nonceStr = RandomUtil.get32RandomStr();
JsonObject.put("nonceStr", nonceStr);
JsonObject.put("package", "prepay_id="+prepay_id);
Long timeStamp= System.currentTimeMillis()/1000;
JsonObject.put("timeStamp", timeStamp+"");
//再次签名
String appid = PayConstant.WX_APPID;
String stringSignTemp = "appId=" + appid
+ "&nonceStr=" + nonceStr
+ "&package=prepay_id=" + prepay_id
+ "&signType=MD5&timeStamp=" + timeStamp;
stringSignTemp = stringSignTemp + "&key=" + PayConstant.WX_MCHKEY;
String paySign = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
JsonObject.put("paySign", paySign);
}
return JsonObject;
}
④ 小程序拿到上述的支付参数后,调用wx.requestpayment就可以调起支付了,用户完成付款后,小程序会回调我们设置的notify_url方便我们进行更新订单状态等后续操作。
附上日志打印:
以上为简单整理的四步逻辑,具体接口的参数可以参考微信支付API文档。https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html