在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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值