微信H5扫码支付 java
?本文直接從代碼調用微信掃碼支付講起。賬號配置,參數生成等請參考官方文檔:? ? ??https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
微信掃碼支付。簡單來說,就是你把微信支付需要的信息,生成到二維碼圖片中。通過微信掃一掃,發起支付。我們需要做的就是二件事:
一:按照微信掃碼支付規則生成二維碼信息.
二:微信沒有提供生成二維碼圖片的接口。需要我們自己把二維碼信息生成到二維碼圖片中。
1.模式選擇:
微信掃碼支付,有兩種模式,文檔中有介紹。第二種模式,微信接口會返回二維碼信息給我們。而第一種模式則需要我們自己去生成二維碼信息。會有些麻 煩。尤其是參數大小寫,還有簽名的問題,容易出錯。總的來說第二種模式比第一種模式簡單。所有我采用的是第二種模式,比較通用。京東與攜程亦用的是第二種 模式。
2.調用統一下單接口獲取帶有二維碼信息的url:(模式二)
模式二的微信掃碼支付,需要先調用微信的統一下單接口,生成預交易單。(參數傳遞與接收都是XML 數據格式。)
正確調用后,會返回含有交易標示ID,和二維碼鏈接的URL。
public void test2{HashMap<String, String> paramMap = Maps.newHashMap();paramMap.put("trade_type", "NATIVE"); //交易類型paramMap.put("spbill_create_ip",localIp()); //本機的IpparamMap.put("product_id", payOrderIdsStr); // 商戶根據自己業務傳遞的參數 必填paramMap.put("body", orderSubject); //描述paramMap.put("out_trade_no", payOrderIdsStr); //商戶 后臺的貿易單號paramMap.put("total_fee", "" + totalCount); //金額必須為整數 單位為分paramMap.put("notify_url", "http://" + getAccessDomain() + "/wx_pay_notify"); //支付成功后,回調地址paramMap.put("appid", siteConfig.getWxPayAppId()); //appidparamMap.put("mch_id", siteConfig.getWxPayMchId()); //商戶號paramMap.put("nonce_str", CommonUtilPub.createNoncestr(32)); //隨機數paramMap.put("sign",CommonUtilPub.getSign(paramMap,siteConfig.getWxPayPartnerKey()));//根據微信簽名規則,生成簽名String xmlData = CommonUtilPub.mapToXml(paramMap);//把參數轉換成XML數據格式}/*** 獲取本機Ip** 通過 獲取系統所有的networkInterface網絡接口 然后遍歷 每個網絡下的InterfaceAddress組。* 獲得符合 <code>InetAddress instanceof Inet4Address</code> 條件的一個IpV4地址* @return*/@SuppressWarnings("rawtypes")private String localIp(){String ip = null;Enumeration allNetInterfaces;try {allNetInterfaces = NetworkInterface.getNetworkInterfaces();while (allNetInterfaces.hasMoreElements()) {NetworkInterface netInterface = (NetworkInterface)allNetInterfaces.nextElement();List<InterfaceAddress> InterfaceAddress = netInterface.getInterfaceAddresses();for (InterfaceAddress add : InterfaceAddress) {InetAddress Ip = add.getAddress();}if (Ip != null && Ip instanceof Inet4Address) {ip = Ip.getHostAddress();}}}catch (SocketException e) {// TODO Auto-generated catch blocklogger.warn("獲取本機Ip失敗:異常信息:"+e.getMessage());}return ip;}成功時返回的XML數據為:
<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx49342bda0ef105dd]]></appid> <mch_id><![CDATA[10019460]]></mch_id> <nonce_str><![CDATA[UneMQd4qWQd0hJ4L]]></nonce_str> <sign><![CDATA[C621A9C586C1F0397D4C6B8003E0CBCE]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx2015070818251790742fea5e0865034508]]></prepay_id> <trade_type><![CDATA[NATIVE]]></trade_type><code_url><![CDATA[weixin://wxpay/bizpayurl?pr=AOFEsxf]]></code_url></xml>解析XML 獲取 code_url:
String resXml = HtmlUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", xmlData);Document dd = null;String code_url = null;try {dd = DocumentHelper.parseText(resXml);} catch (DocumentException e) {return "";}if (dd != null) {Element root = dd.getRootElement();}if (root == null) {return "";}Element codeUrl = root.element("code_url");if (piEle == null) {return "";}code_url = codeUrl.getText(); //解析 xml 獲得 code_url動態生成二維碼圖片
使用的是google ZXing庫。 提供一個 jar 地址 直接引入到自己項目即可。http://download.csdn.net/detail/gonwy/7658135 ?
?頁面代碼:
<img src="qr_code.img?code_url= <#if code_url??>${code_url}</#if>" style="width:300px;height:300px;"/>后端接口
/*** 生成二維碼圖片并直接以流的形式輸出到頁面* @param code_url* @param response*/@RequestMapping("qr_code.img")@ResponseBodypublic void getQRCode(String code_url,HttpServletResponse response){GenerateQrCodeUtil.encodeQrcode(code_url, response);}?
/*** 生成二維碼圖片 不存儲 直接以流的形式輸出到頁面* @param content* @param response* */@SuppressWarnings({ "unchecked", "rawtypes" })public static void encodeQrcode(String content,HttpServletResponse response){if(StringUtils.isBlank(content))return;MultiFormatWriter multiFormatWriter = new MultiFormatWriter();Map hints = new HashMap();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//設置字符集編碼類型BitMatrix bitMatrix = null;try {bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300,hints);}catch ( Exception e1) {// TODO Auto-generated catch block26e1.printStackTrace();}BufferedImage image = toBufferedImage(bitMatrix);//輸出二維碼圖片流18try {ImageIO.write(image, "png", response.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch block22e.printStackTrace();}}然后生成的圖片,通過微信掃碼就可以發起支付了。
支付成功后,微信會調用,你之前設置的回調函數地址。并且會把你之前傳給微信的商戶自定義參數帶給你,以幫助商戶完成余下業務流程。
源碼下載:https://download.csdn.net/download/a947851266/9925882
總結
以上是生活随笔為你收集整理的微信H5扫码支付 java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为手机fastboot解锁
- 下一篇: Android网络收集和ping封装库