微信小程序支付JAVA后台逻辑

版权声明:原创文章,未经允许不得转载. https://blog.csdn.net/shengqianfeng/article/details/79065371

① 小程序前端会通过调用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;
	}
  ④ 小程序拿到上述的支付参数后,调用wx.requestpayment就可以调起支付了,用户完成付款后,小程序会回调我们设置的notify_url方便我们进行更新订单状态等后续操作。


附上日志打印:

以上为简单整理的四步逻辑,具体接口的参数可以参考微信支付API文档。 https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html

猜你喜欢

转载自blog.csdn.net/shengqianfeng/article/details/79065371