1. 程式人生 > >在OpenJweb平臺中實現微信刷卡支付(被動掃碼)

在OpenJweb平臺中實現微信刷卡支付(被動掃碼)

微信刷卡支付流程:

(1)顧客付款時,點微信錢包左上角的付款。

(2)付款介面有二維碼、條碼和一排18位的數字,這個數字是有時間限制的,每分鐘重新整理一次。

(3)商家POS機中錄完商品及價格後,用掃碼槍掃顧客手機中的條碼或二維碼,實際就是讀取顧客的18位的數字串,讀取到商家的系統中。

(4)商家系統將價格、產品名、顧客付款條碼(18位,在微信中稱為authCode),構造xml,提交到微信平臺(商家需要開通自己的微信服務號和微信支付平臺,或者使用第三方的平臺代結算)。實際應用場景是,掃碼完成後,商家系統自動提交支付請求,顧客微信扣款成功後,在顧客的手機中會顯示支付成功。

下面是實現的程式碼,大致分兩步,第一步是構造xml串,第二步是提交支付申請,支付申請如果提交成功,顧客微信會自動扣款(超過一定的額度要輸入支付密碼)。

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.openjweb.weixin.entity.*"%>
<%@ page import="com.openjweb.weixin.util.*"%>
<%@ page import="org.openjweb.core.service.*"%>
<%@ page import="org.openjweb.core.util.*"%>
<%
//被掃支付介面(刷卡支付介面)---個人出示微信錢包的付款,商家用掃碼槍掃二維碼或條碼。
String authCode = request.getParameter("authCode");//通過掃碼槍識別的使用者微信支付條碼(有時間限制,1分鐘重新整理一次)
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean("IDBSupportService3");
WeixinServiceAccount accEnt = (WeixinServiceAccount)service.findSingleValueByHql("from WeixinServiceAccount where accountId='c0001-1'");
String appId = accEnt.getAppId();//微信服務號的appId
String mchId = accEnt.getPartnerId();//商戶號
String deviceInfo ="ST0001";//商戶自定義編號如門店號
String rand = StringUtil.getUUID();//隨機碼
String sign ="";//簽名,需要計算
String body="刷卡支付測試";
String attach="訂單額外描述";
String orderId = StringUtil.getUUID();//訂單號
String totalFee = "1";//金額,分為單位
String ip = request.getHeader("X-Real-IP");//實際IP地址
String goodsTag="";
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>(); //帶排序功能的Map
parameters.put("appid", appId);//商戶appid
parameters.put("mch_id", mchId);//商戶ID
parameters.put("device_info", deviceInfo);//
parameters.put("nonce_str",rand);//隨機字串
parameters.put("body", body);//
parameters.put("attach", attach);
parameters.put("out_trade_no", orderId);//
parameters.put("total_fee", totalFee);
parameters.put("spbill_create_ip", ip);//
parameters.put("goods_tag", goodsTag);//
parameters.put("auth_code", authCode);//
sign = CommonUtil.createSign("UTF-8", accEnt.getAccountId(),parameters);//計算簽名
parameters.put("sign", sign);
String xml = CommonUtil.getRequestXml(parameters);//轉換為XML串
//呼叫刷卡支付介面扣款
String xml1 = RedBagUtil.httpsRequest("

https://api.mch.weixin.qq.com/pay/micropay","POST",xml,accEnt.getAccountId(),accEnt.getPartnerId());
out.println(xml1);       
//返回的XML:
/*

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wxce65957f84c7372b]]></appid><mch_id><![CDATA[1315931801]]></mch_id><device_info><![CDATA[ST0001]]></device_info><nonce_str><![CDATA[3c5d87f8e5dc401298478b397009847b]]></nonce_str><sign><![CDATA[50AEDF0A9D0896AB489D8CB8EA24B920]]></sign><result_code><![CDATA[SUCCESS]]></result_code><openid><![CDATA[o8LuytzDEI20nM9odOi-ko7-HT14]]></openid><is_subscribe><![CDATA[Y]]></is_subscribe><trade_type><![CDATA[MICROPAY]]></trade_type><bank_type><![CDATA[CFT]]></bank_type><total_fee>1</total_fee><fee_type><![CDATA[CNY]]></fee_type><transaction_id><![CDATA[4008372001201612062001726379]]></transaction_id><out_trade_no><![CDATA[80a41816f5f34c20885207c35dfe7bb1]]></out_trade_no><attach><![CDATA[訂單額外描述]]></attach><time_end><![CDATA[20161206211713]]></time_end><cash_fee>1</cash_fee><cash_fee_type><![CDATA[CNY]]></cash_fee_type></xml>
*/
%>

可以看出,在OpenJweb平臺中實現刷卡支付很簡單。很多微信的呼叫已進行了封裝。

作者微信openjweb Q Q 29803446