日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微信公众号支付(统一下单、支付结果通知、查询订单)

發(fā)布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信公众号支付(统一下单、支付结果通知、查询订单) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近做的項(xiàng)目涉及到微信公眾號的支付,翻遍文檔和查閱眾多資料后,記一下自己整的過程:

1.先看的官方文檔,把DEMO下載下來,發(fā)現(xiàn)都是要證書的,繼續(xù)看文檔,API列表

2.還是看文檔,參數(shù),坑最多的地方,這里需要在工具類里邊先配置幾個東西,需要在公眾號的賬號和商戶號里面預(yù)先設(shè)置好

公眾號AppId 微信支付商戶號 微信支付API秘鑰

微信支付通知URL 我用的是內(nèi)網(wǎng)穿透工具 nat300 映射的已備案域名

3.調(diào)用微信統(tǒng)一下單的接口,微信只接收XML格式的字符串,返回的也是XML格式的字符串,主要代碼如下:

/*** 微信公眾號支付統(tǒng)一下單* @param req* @param request* @return* @throws Exception*/@Overridepublic ServiceResult<Object> unifiedorder(WxOrderReq req, HttpServletRequest request, String openId) {Map<String, String> paraMap = new HashMap<String, String>();paraMap.put("appid", WXPayConfig.APP_ID);paraMap.put("mch_id", WXPayConfig.MCH_ID);paraMap.put("nonce_str", WXPayUtil.generateNonceStr()); //隨機(jī)字符串,長度要求在32位以內(nèi)。paraMap.put("body", req.getIntroduce());paraMap.put("out_trade_no", orderNumber);paraMap.put("total_fee", req.getSum().multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString()); //訂單總金額,單位為分paraMap.put("spbill_create_ip", IpUtil.getIpAddr(request));paraMap.put("notify_url", WXPayConfig.NOTIFY_URL);paraMap.put("trade_type", WXPayConfig.TRADE_TYPE_JSAPI);paraMap.put("openid", openId);Map<String, String> payMap = new HashMap<String, String>();try {String sign = WXPayUtil.generateSignature(paraMap, WXPayConfig.KEY);//簽名,將所有的請求參數(shù)按照ASCII字典排序后,按照規(guī)定格式拼接成字符串,再使用MD5加密后生成paraMap.put("sign", sign);// 統(tǒng)一下單 https://api.mch.weixin.qq.com/pay/unifiedorderString url = WXPayConfig.UNIFIED_ORDER_URL;String xml = WXPayUtil.mapToXml(paraMap);//將map轉(zhuǎn)成xml格式的 字符串(微信只接受xml格式的字符串)String xmlStr = HttpKit.post(url, xml); //請求微信統(tǒng)一下單接口(微信只返回xml格式的字符串)Map<String, String> map = WXPayUtil.xmlToMap(xmlStr); //將xml格式的字符串轉(zhuǎn)成 map//xmlStr.indexOf("SUCCESS") != -1if (!map.get("return_code").equals("SUCCESS")) {return ServiceResult.newFailure(new CodeMsg(-1,"調(diào)用接口失敗!!!!!!"));}// 微信生成的預(yù)支付會話標(biāo)識,該值有效期為2小時String prepay_id = map.get("prepay_id");payMap.put("appId", WXPayConfig.APP_ID);payMap.put("timeStamp", String.valueOf(WXPayUtil.getCurrentTimestamp()));payMap.put("nonceStr", WXPayUtil.generateNonceStr());payMap.put("signType", WXPayConfig.SIGNTYPE);payMap.put("package", "prepay_id=" + prepay_id);String paySign = WXPayUtil.generateSignature(payMap, WXPayConfig.KEY);payMap.put("paySign", paySign);payMap.put("outTradeNo",orderNumber);} catch (Exception e) {e.printStackTrace();}//新增訂單業(yè)務(wù)return ServiceResult.newSuccess(payMap);}

?

4.支付結(jié)果通知,這個接口是在工具類中配置好的 微信支付通知url

/*** 支付結(jié)果通知* @param request* @param response*/public ServiceResult<Object> getWeChatPayReturn(HttpServletRequest request, HttpServletResponse response){String resSuccessXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";String resFailXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[報文為空]]></return_msg></xml>";String resXml = "";try {InputStream inStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}WXPayUtil.getLogger().info("wxnotify:微信支付----start----");// 獲取微信調(diào)用我們notify_url的返回信息String result = new String(outSteam.toByteArray(), "utf-8");WXPayUtil.getLogger().info("wxnotify:微信支付----result----=" + result);// 關(guān)閉流outSteam.close();inStream.close();// xml轉(zhuǎn)換為mapMap<String, String> resultMap = WXPayUtil.xmlToMap(result);boolean isSuccess = false;if (WXPayConstants.SUCCESS.equalsIgnoreCase(resultMap.get("return_code"))){WXPayUtil.getLogger().info("wxnotify:微信支付----返回成功");if (WXPayUtil.isSignatureValid(resultMap,WXPayConfig.KEY)){// 訂單處理 操作 orderconroller 的回寫操作?WXPayUtil.getLogger().info("wxnotify:微信支付----驗(yàn)證簽名成功");// 通知微信.異步確認(rèn)成功.必寫.不然會一直通知后臺.八次之后就認(rèn)為交易失敗了.resXml = resSuccessXml;isSuccess = true;} else {WXPayUtil.getLogger().error("wxnotify:微信支付----判斷簽名錯誤");}} else {WXPayUtil.getLogger().error("wxnotify:支付失敗,錯誤信息:" + resultMap.get("return_msg"));resXml = resFailXml;}// 回調(diào)方法,處理業(yè)務(wù) - 修改訂單支付狀態(tài)WXPayUtil.getLogger().info("wxnotify:微信支付回調(diào):修改的訂單===>" + resultMap.get("out_trade_no")); // logger.info("resultMap::::::",resultMap);ServiceResult<Object> updateResult = orderService.updateOrderState(resultMap.get("out_trade_no"));if (updateResult.success()){WXPayUtil.getLogger().info("wxnotify:微信支付回調(diào):修改訂單支付狀態(tài)成功");} else {WXPayUtil.getLogger().error("wxnotify:微信支付回調(diào):修改訂單支付狀態(tài)失敗");}} catch (Exception e) {e.printStackTrace();}finally {try {// 處理業(yè)務(wù)完畢BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();} catch (IOException e) {WXPayUtil.getLogger().error("wxnotify:支付回調(diào)發(fā)布異常:out:", e);}}return ServiceResult.newSuccess(resXml);}

?

5.查詢訂單? 根據(jù)訂單號向微信發(fā)起請求 得知該訂單的狀態(tài)

/*** 查詢訂單* @param req* @return* @throws Exception*/@Overridepublic ServiceResult<Object> orderQuery(OrderQueryReq req) {String trade_state = null;String accessToken = req.getAccessToken();ObjectResult<User> userByToken = authFeignService.getUserByToken(accessToken);User data = userByToken.getData();if (data == null) {return ServiceResult.newFailure(CodeMsg.ERROR_ACCESS_TOKEN);}Map<String, String> paraMap = new HashMap<String, String>();paraMap.put("appid",WXPayConfig.APP_ID);paraMap.put("mch_id",WXPayConfig.MCH_ID);paraMap.put("nonce_str",WXPayUtil.generateNonceStr()); //隨機(jī)字符串,長度要求在32位以內(nèi)。paraMap.put("out_trade_no",req.getOutTradeNo());try {String sign = WXPayUtil.generateSignature(paraMap, WXPayConfig.KEY);//簽名,將所有的請求參數(shù)按照ASCII字典排序后,按照規(guī)定格式拼接成字符串,再使用MD5加密后生成paraMap.put("sign", sign);// 查詢訂單 https://api.mch.weixin.qq.com/pay/orderqueryString url = WXPayConfig.ORDER_QUERY;String xml = WXPayUtil.mapToXml(paraMap);//將map轉(zhuǎn)成xml格式的 字符串(微信只接受xml格式的字符串)String xmlStr = HttpKit.post(url, xml); //請求微信查詢訂單接口(微信只返回xml格式的字符串)Map<String, String> map = WXPayUtil.xmlToMap(xmlStr); //將xml格式的字符串轉(zhuǎn)成 mapSystem.err.println(map);trade_state = map.get("trade_state");}catch (Exception e){e.printStackTrace();}//SUCCESS—支付成功 REFUND—轉(zhuǎn)入退款 NOTPAY—未支付 CLOSED—已關(guān)閉 REVOKED—已撤銷(付款碼支付)// USERPAYING--用戶支付中(付款碼支付) PAYERROR--支付失敗(其他原因,如銀行返回失敗)if ("SUCCESS".equals(trade_state)){return ServiceResult.newSuccess(0);}if ("REFUND".equals(trade_state)){return ServiceResult.newSuccess("轉(zhuǎn)入退款");}if ("NOTPAY".equals(trade_state)){return ServiceResult.newSuccess("未支付");}if ("CLOSED".equals(trade_state)){return ServiceResult.newSuccess("已關(guān)閉");}if ("REVOKED".equals(trade_state)){return ServiceResult.newSuccess("已撤銷(付款碼支付)");}if ("USERPAYING".equals(trade_state)){return ServiceResult.newSuccess("用戶支付中(付款碼支付)");}if ("PAYERROR".equals(trade_state)){return ServiceResult.newSuccess("支付失敗");}return ServiceResult.newSuccess(trade_state);}

?

比較懶,所以就直接放的代碼了,歡迎大家交流指正?tansky1995@gmail.com

總結(jié)

以上是生活随笔為你收集整理的微信公众号支付(统一下单、支付结果通知、查询订单)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。