微信扫码支付、聚合支付
0、微信開放平臺(非微信公眾平臺)申請賬號,需要appid、mch_id(商戶號)、key(apikey)幾個參數
1、微信掃碼支付跟自定義生成支付寶二維碼支付差不多https://blog.csdn.net/qq_39506978/article/details/101154388,不同于支付寶的地方是,微信沒有沙箱環境,也沒有SDK,甚至傳輸的數據不是常用的JSON,就是赤裸裸的httpclient調用,但是我覺得比支付寶支付還更簡單,沒那么多坑。雖然沒有SDK,但是網上也有成型的工具類啊。https://blog.csdn.net/webmastar/article/details/80238951;我用的這個哥老關的,沒得問題。
2、生成二維碼流程跟支付寶差不多,也是根據前端訂單ID查詢訂單信息,封裝httpclient請求參數(注意微信的money用的是分,阿里是元),從響應里獲取二維碼URL,用response寫回給img的src請求源
public void wxpay(String orderId, HttpServletResponse response) throws JDOMException, IOException {ServiceOrder order = orderMapper.selectById(orderId);SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();packageParams.put("appid", WXConfig.appid);packageParams.put("mch_id", WXConfig.mch_id);packageParams.put("nonce_str", IdWorker.get32UUID());packageParams.put("body", "XXX");packageParams.put("time_expire", LocalDateTime.now().plusMinutes(1L).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));packageParams.put("out_trade_no", order.getOrderNo());packageParams.put("total_fee", String.valueOf((int) (order.getPayPrice().doubleValue() * 100)));packageParams.put("spbill_create_ip", WXConfig.spbill_create_ip);packageParams.put("notify_url", wxpayNotifyUrl);packageParams.put("trade_type", "NATIVE");String sign = PayCommonUtil.createSign("UTF-8", packageParams, WXConfig.key);packageParams.put("sign", sign);log.info("微信請求入參" + JSON.toJSONString(packageParams));String requestXML = PayCommonUtil.getRequestXml(packageParams);log.info("微信請求入參xml" + requestXML);String resXml = HttpUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXML);Map map = XMLUtil.doXMLParse(resXml); //微信返回的不是json格式需要轉換為jsonlog.info("微信返回" + JSON.toJSONString(map));String urlCode = (String) map.get("code_url");//使用谷歌生成二維碼,將二維碼寫回瀏覽器,注意不要被網關攔截了writeToServletFile(urlCode, response);}3、同支付寶,微信異步通知也需要在開放平臺配置一個外網可訪問的接口。跟微信交互的數據格式都是XML,如下需要解析XML為map,響應給微信的也要封裝成XML
@Overridepublic void wxpayNotifyUrl(HttpServletRequest request, HttpServletResponse response) throws IOException, JDOMException {log.info("微信開始回調");//讀取參數InputStream inputStream;StringBuffer sb = new StringBuffer();inputStream = request.getInputStream();String s;BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));while ((s = in.readLine()) != null) {sb.append(s);}in.close();inputStream.close();//解析xml成mapMap<String, String> m = new HashMap<String, String>();m = XMLUtil.doXMLParse(sb.toString());//過濾空 設置 TreeMapSortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator it = m.keySet().iterator();while (it.hasNext()) {String parameter = (String) it.next();String parameterValue = m.get(parameter);String v = "";if (null != parameterValue) {v = parameterValue.trim();}packageParams.put(parameter, v);}log.info(JSON.toJSONString(packageParams));//判斷簽名是否正確if (PayCommonUtil.isTenpaySign("UTF-8", packageParams, WXConfig.key)) {//處理業務開始String resXml = "";if ("SUCCESS".equals((String) packageParams.get("result_code"))) {// 支付成功,執行自己的業務邏輯String out_trade_no = (String) packageParams.get("out_trade_no");log.info("支付成功,開始修改該訂單為處理中");int update = orderMapper.update(new ServiceOrder().setStatus(Constants.OrderStatus.PAY_OK.getOrderStatus()), new QueryWrapper<ServiceOrder>().eq("order_no", out_trade_no).eq("status", Constants.OrderStatus.NO_PAY.getOrderStatus()));if (update != 1) {log.error("支付成功,但跟新訂單狀態為處理出現失敗,訂單號:{},錯誤原因:{}", out_trade_no, packageParams.get("err_code"));resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"+ "<return_msg><![CDATA[報文為空]]></return_msg>" + "</xml> ";} else {//異步處理該訂單。收了錢不能退款,告訴用戶成功。異步處理訂單如有錯誤需要人工處理。asyncProcessOrder(out_trade_no);//通知微信.異步確認成功.必寫.不然會一直通知后臺.八次之后就認為交易失敗了.resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";}} else {log.error("支付錯誤原因:{}", packageParams.get("err_code"));resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"+ "<return_msg><![CDATA[報文為空]]></return_msg>" + "</xml> ";}//處理業務完畢BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();} else {log.info("通知簽名驗證失敗");}}4、關于聚合支付
聚合支付適合小公司簡單集成多種支付,大公司有自己內部聚合支付,使用聚合支付,我們不用去微信、支付寶、京東、銀聯申請配置各種亂七八糟的參數,只需要聚合支付的參數就可以了,各種支付渠道參數有改變也不影響我們,只需要聚合支付去對接就可以了。但是錢支付到聚合支付上,聚合支付再調用對應支付,將錢付到各種支付渠道,效率較慢且有一定風險,聚合支付公司可能哪天就玩完了...
?
?
總結
以上是生活随笔為你收集整理的微信扫码支付、聚合支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UG 常用设置
- 下一篇: axure手机页面设计说明_Axure中