作者:姑获_626 | 来源:互联网 | 2023-10-13 11:49
① 小程序前端会通过调用wx.login接口获取得到登陆凭据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 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;
}
④ 小程序拿到上述的支付参数后,调用wx.requestpayment就可以调起支付了,用户完成付款后,小程序会回调我们设置的notify_url方便我们进行更新订单状态等后续操作。
附上日志打印:
以上为简单整理的四步逻辑,具体接口的参数可以参考微信支付API文档。
https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html