上一篇介绍了被动扫码的实现,本文介绍如何在OpenJWeb平台中实现主动扫码(商家生成支付二维码),出示给用户,用户扫码后通过微信付款。
业务流程:
(1)商家在POS机中录好了商品和价格,然后调用微信的预下单接口(商家需要有自己的微信服务号和微信支付平台,或者使用第三方平台的微信服务号代收款)。
(2)预下单接口中,交易类型需要选择NATIVE,这样才能返回二维码链接参数code_url。
(3)系统根据code_url的值,生成二维码图片,这个图片展示给顾客,让顾客扫码支付。
(4)顾客扫码成功后,系统进行支付后的处理。
下面是主动扫码的实现代码:
<%@ 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.*"%>
<%@ page import="com.openjweb.erp.barcode.*"%>
<%
//顾客扫商家的二维码
String orderId = "SC20161207000007"; //订单号
String accountId ="c0001-1"; //这个是openjweb中根据此服务号代码查找对应的微信服务号的appId,mchId等信息
String loginId = "1459321703053002024";//登录账号,根据登录账号查找对应的微信OpenID
String xml =CommonUtil. createPostData(request,loginId,orderId ,accountId,"NATIVE");//构造xml串
//调用预下单接口
String xml1 = CommonUtil. httpsRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", xml, orderId);
//获取codeUrl(返回的xml中有code_url的值):
/*
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wxce65957f84c7372b]]></appid><mch_id><![CDATA[1315931801]]></mch_id><nonce_str><![CDATA[9gHyz2VItFzr5Y66]]></nonce_str><sign><![CDATA[0D63B28EE3EC6CC92855C267170A669A]]></sign><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx20161207073003942f6cf2960533727688]]></prepay_id><trade_type><![CDATA[NATIVE]]></trade_type><code_url><![CDATA[weixin://wxpay/bizpayurl?pr=NJRm3sd]]></code_url></xml>
*/
//从返回的xml中解析出code_url
Map<String,String> map = MessageUtil.pasrseXmlString(xml1);
String codeUrl = (String)map.get("code_url");
out.println(codeUrl);
//将codeUrl转换为二维码图片,并保存到web应用的images目录,命名为tmp123.png
org.openjweb.core.util.QRCodeUtil.encode(codeUrl, request.getRealPath("/images/"),200,200,200,"tmp123.png");
%>
<html>
<head>
</head>
<body>
<img src="<%=imgPath%>">
</body>
</html>
<%=imgPath%>中在页面中将这个二维码图片展示出来,在POS系统中,需要将这个二维码展示给顾客扫码。
作者微信号openjweb Q-Q:29803446