微信小程式支付JAVA後臺邏輯
阿新 • • 發佈:2019-01-09
① 小程式前端會通過呼叫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,得到其中的一些支付需要的引數進行二次簽名,並返回給小程式。
④ 小程式拿到上述的支付引數後,呼叫wx.requestpayment就可以調起支付了,使用者完成付款後,小程式會回撥我們設定的notify_url方便我們進行更新訂單狀態等後續操作。@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; }
附上日誌列印:
以上為簡單整理的四步邏輯,具體介面的引數可以參考微信支付API文件。https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html