扫码支付可以在h5调起微信客户端支付实现吗

【工程师必读】如何实现微信扫码支付?
我的图书馆
【工程师必读】如何实现微信扫码支付?
一、硬件环境Linux工控机:致远电子DCP-3000L工控机,配套7寸LVDS液晶屏,分辨率800x480;服务器:64位Ubuntu主机,具备上网功能;手机客户端:微信客户端,具备扫一扫识别二维码功能。整体硬件连接框架如图 1所示:&图1 硬件连接图二、演示效果先看看最终的效果,客户端使用Qt框架编写,其启动界面如图 2所示:&图2 演示Demo主界面点击小键盘,输入支付金额,点击确定后客户端将与服务器进行通信,拿到支付链接,本地生成支付二维码,如图 3所示:&图3 生成支付二维码接下来打开手机微信客户端,使用扫一扫进行扫码,根据支付页面提示输入支付密码,支付结果如图 4所示:&图4 支付结果完成支付后,演示客户端界面上将显示支付成功字样,如图 5所示:&图5 显示支付结果扫码接入为何如何容易?服务器客户端应该怎么处理?PHP是不是世界上最好的语言?说好的源码究竟在哪里?敬请关注本文以下章节。三、系统流程整个项目采用CS架构,分为嵌入式Linux客户端、后台服务器以及手机客户端三部分,系统流程如图 6所示:&图6 系统流程图从系统流程图中可以看到,我们需要编写客户端和服务器端的代码,客户端我们使用的是QT框架,服务器端我们直接使用微信官方的支付SDK包。在客户端与服务器的交互过程中,最主要的是拿到微信支付的链接地址以及订单号,链接地址为了生成二维码图片,订单号为了查询支付状态。四、服务器端实现从微信官方下载SDK(文末有链接),有JAVA、.NET C#、PHP三种类型的SDK提供,如图 7所示:&图7 微信SDK这里我们选择PHP版本进行下载,服务器端环境为Ubuntu14.04系统,采用nginx进行搭建,端口号8080。(必答题:PHP是世界上___的语言)1、PHP NGINX环境搭建我们在Ubuntu主机上进行nginx服务器的搭建,具体步骤为安装-配置-启动。安装nginx服务器:配置nginx服务器,为了不与其它服务器监听端口号冲突,我们直接修改nginx服务器的配置,将默认的80端口修改为8080,修改过程如下:启动nginx服务器:由于我们使用的是微信官方SDK的PHP版本,所以我们需要为系统装上PHP环境,同时需要修改nginx服务器的配置,使其支持PHP。安装PHP环境比较简单,Ubuntu 14.04中的安装命令如下:接下来修改nginx服务器配置,使其支持PHP:在/usr/share/nginx/html目录下新建index.php,重启php5-fpm和nginx进行测试:打开本地浏览器,输入地址localhost:8080即可看到对应PHP页面,如图 8所示,此时PHP NGINX环境搭建已完成。&图8 PHP NGINX测试结果2、微信SDK安装及修改将下载好的微信支付PHP版本的SDK进行解压,并将相关文件拷贝到nginx服务器根目录(默认为/usr/share/nginx/html,可通过修改/etc/nginx/sitesavailable/default的root参数进行指定,这里我们使用默认参数):本地浏览器中输入地址服务器地址,可以看到微信SDK已经运行起来了,如图 9所示:&图9 微信SDK页面接下来我们需要对SDK进行修改,主要是替换商户信息,SSL服务端验证禁用,支付接口实现,查询接口实现等。替换商户信息要使用微信支付,必须先开通公众号或企业号微信支付的相关功能,这里不对如何开通做过多说明,在开通微信支付后,微信会提供商户信息,如商户号、支付秘钥等。我们需要替换/lib/WxPay.Config.php文件的商户信息(SDK中的文件,已经被我们拷贝到nginx服务器根目录),修改的位置如下:SSL服务端验证禁用下载的SDK包为V3版本,在低版本的SSL库上运行会出现错误,我们直接禁用SSL服务端验证功能,修改/lib/WxPay.Api.php文件,将postXmlCurl函数中的SSL服务端验证功能禁用,修改如下:支付接口实现扫码支付接口位于/example/native.php文件中,原生SDK包中有示例代码,我们对其进行修改,实现的执行流程为获取输入金额→请求微信支付链接→下发链接地址及订单号,这里我们使用了分隔符简单进行数据的封装,实际应用中可以加入JSON或XML格式的响应报文。修改后的代码如下:查询接口实现订单查询接口位于/example/orderquery.php文件中,我们对其进行修改,当客户端POST订单号到该接口后,将进行相应订单号的支付状态查询,然后返回支付状态。修改后代码如下:以上四步完成了微信SDK的安装和修改,同时实现了支付接口以及查询接口,至此,服务器部署已完成。五、客户端实现客户端使用Qt框架编写,其中需要处理的几个关键点有二维码图片生成、网络通信及数据解析,下面介绍各个部分实现的重点。1、二维码图片生成我们使用了开源的QRencode进行二维码图片的生成,可以将QRencode的源码集成进Qt工程中调用,也可以使用编译好的QRencode可执行文件进行调用。这里我们直接编译QRencode源码,编译依赖zlib以及libpng库,为了编译方便,源码包中提供了一个自动化编译脚本,编译过程如下:编译完成后,可以得到qrencode二维码生成工具,其大致用法如下:在Qt中调用该工具显示二维码的代码如下:2、网络通信及数据解析我们使用了Qt的QNetworkRequest模块进行网络通信,将相关功能封装成Post函数供调用,与服务器交互及数据解析的代码如下:这里说明下硬件连接方式,首先服务器为Ubuntu主机,工控机通过网线将百兆网口与服务器直连,形成一个局域网。而本项目中服务器局域网地址为192.168.1.164,所以在源码中直接指定了服务器地址,当使用无线上网时可以修改服务器地址为远程服务器的公网IP地址(重大消息:DCP-3000L工控机自带4G无线上网功能,同时具备全网通拨号守护脚本,支持断线重拨,流量异常检测,三网自动识别。)。客户端剩下的就是界面的逻辑处理啦,在第一小节部分我们已经看到了演示的效果,就不在详细介绍了。项目中支付完成后是显示支付完成并等待下一次支付,而在实际应用中往往是进行硬件操作,如打开继电器开关,播放音乐等等。至此,微信扫码支付已介绍完毕,源码往下拉。&六、说好的源码&源码github地址:/kp339/qt-wxpay.git微信SDK下载链接:https://pay./wiki/doc/api/native.php?chapter=11_1致远电子DCP3000网址:/ipc/ipc/product/id/129.html&后台回复关键字【工业控制】,查看更多相关技术专题。
TA的最新馆藏[转]&
喜欢该文的人也喜欢此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
微信极速开发系列文章:
上一篇文章介绍了微信提供的那些支付方式以及公众号支付/p/cba7
这篇文章我们来聊聊微信扫码支付(模式一以及模式二)
微信扫码支付文档
###### 扫码支付分为以下两种方式:
【模式一】:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号)。用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统(需要设置支付回调URL),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程。
【模式二】:商户后台系统调用微信支付生成预付交易,将接口返回的链接生成二维码,用户扫码后输入密码完成支付交易。注意:该模式的预付单有效期为2小时,过期后无法支付。
扫码支付模式一
1、设置支付回调URL
商户支付回调URL设置指引:进入公众平台--&微信支付--&开发配置--&扫码支付--&修改 如下图(来自官方文档)
在中扫码支付模式一的回调URL为http://域名[/项目名称]/pay/wxpay
2、根据微信支付规则链接生成二维码
2.1 生成二维码规则
二维码中的内容为链接,形式为:
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
详细的参数说明参考文档
商户ID(mch_id)如何获取
签名安全规则文档
在中 扫码支付模式一 生成二维码规则封装如下:
public String getCodeUrl(){
String url=&weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXX&time_stamp=XXXXX&nonce_str=XXXXX&;
String product_id=&001&;
String timeStamp=Long.toString(System.currentTimeMillis() / 1000);
String nonceStr=Long.toString(System.currentTimeMillis());
Map&String, String& packageParams = new HashMap&String, String&();
packageParams.put(&appid&, appid);
packageParams.put(&mch_id&, partner);
packageParams.put(&product_id&,product_id);
packageParams.put(&time_stamp&, timeStamp);
packageParams.put(&nonce_str&, nonceStr);
String packageSign = PaymentKit.createSign(packageParams, paternerKey);
return StringUtils.replace(url, &XXXXX&, packageSign,appid,partner,product_id,timeStamp,nonceStr);
以上action 在中 访问地址为http://域名[/项目名称]/pay/getCodeUrl 其中 product_id 根据实际的业务逻辑可以当做参数传入
2.2 生成二维码并在页面上显示
根据2.1生成二维码规则生成了二维码中的内容(链接)来生成二维码。
商户可调用第三方库生成二维码图片
这里使用google 开源图形码工具Zxing
项目中引入相关的jar包 具体配置参考项目中的pom.xml
&!-- 版本号--&
&zxing.version&3.2.1&/zxing.version&
&!-- 开源多维码生成工具 --&
&dependency&
&groupId&com.google.zxing&/groupId&
&artifactId&core&/artifactId&
&version&${zxing.version}&/version&
&/dependency&
&dependency&
&groupId&com.google.zxing&/groupId&
&artifactId&javase&/artifactId&
&version&${zxing.version}&/version&
&/dependency&
封装的工具类为com.javen.kit.ZxingKit
* google 开源图形码工具Zxing使用
public class ZxingKit {
private static Log log = Log.getLog(ZxingKit.class.getSimpleName());
* Zxing图形码生成工具
* @param contents
* @param barcodeFormat
BarcodeFormat对象
* @param format
图片格式,可选[png,jpg,bmp]
* @param width
* @param height
* @param margin
边框间距px
* @param saveImgFilePath
存储图片的完整位置,包含文件名
public static Boolean encode(String contents, BarcodeFormat barcodeFormat, Integer margin,
ErrorCorrectionLevel errorLevel, String format, int width, int height, String saveImgFilePath) {
Boolean bool =
BufferedImage bufI
Map&EncodeHintType, Object& hints = new HashMap&EncodeHintType, Object&();
// 指定纠错等级
hints.put(EncodeHintType.ERROR_CORRECTION, errorLevel);
hints.put(EncodeHintType.MARGIN, margin);
hints.put(EncodeHintType.CHARACTER_SET, &UTF-8&);
// contents = new String(contents.getBytes(&UTF-8&), &ISO-8859-1&);
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, barcodeFormat, width, height, hints);
MatrixToImageConfig config = new MatrixToImageConfig(0xFFxFFFFFFFF);
bufImg = MatrixToImageWriter.toBufferedImage(bitMatrix, config);
bool = writeToFile(bufImg, format, saveImgFilePath);
} catch (Exception e) {
e.printStackTrace();
* @param srcImgFilePath
要解码的图片地址
@SuppressWarnings(&finally&)
public static Result decode(String srcImgFilePath) {
Result result =
File srcFile = new File(srcImgFilePath);
image = ImageIO.read(srcFile);
if (null != image) {
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Hashtable&DecodeHintType, String& hints = new Hashtable&DecodeHintType, String&();
hints.put(DecodeHintType.CHARACTER_SET, &UTF-8&);
result = new MultiFormatReader().decode(bitmap, hints);
log.debug(&Could not decode image.&);
} catch (Exception e) {
e.printStackTrace();
} finally {
* 将BufferedImage对象写入文件
* @param bufImg
BufferedImage对象
* @param format
图片格式,可选[png,jpg,bmp]
* @param saveImgFilePath
存储图片的完整位置,包含文件名
@SuppressWarnings(&finally&)
public static Boolean writeToFile(BufferedImage bufImg, String format, String saveImgFilePath) {
Boolean bool =
bool = ImageIO.write(bufImg, format, new File(saveImgFilePath));
} catch (Exception e) {
e.printStackTrace();
} finally {
public static void main(String[] args) {
String saveImgFilePath = &D://zxing.png&;
Boolean encode = encode(&我是Javen205&, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, &png&, 200, 200,
saveImgFilePath);
if (encode) {
Result result = decode(saveImgFilePath);
String text = result.getText();
System.out.println(text);
OK 上面就是生成支付二维码的部分,接下来就是要将二维码显示在页面上,于是就有了下面的代码:
com.javen.weixin.controller.WeixinPayController.getPayQRCode()
src\\main\\webapp\\view\\payQRCode.jsp
* 生成支付二维码(模式一)并在页面上显示
public void scanCode1(){
//获取扫码支付(模式一)url
String qrCodeUrl=getCodeUrl();
System.out.println(qrCodeUrl);
//生成二维码保存的路径
String name = &payQRCode.png&;
Boolean encode = ZxingKit.encode(qrCodeUrl, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, &png&, 200, 200,
PathKit.getWebRootPath()+File.separator+&view&+File.separator+name );
if (encode) {
//在页面上显示
setAttr(&payQRCode&, name);
render(&payQRCode.jsp&);
JSP 部分代码如下
&img alt=&& src=&&%=path %&/view/${payQRCode}&&
最终生成二维码访问地址为http://域名[/项目名称]/pay/scanCode1
以上就是微信扫码支付(模式一)生成支付二维码的全过程
3、扫码回调商户支付URL
用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统。
此回调的URL为上文设置支付回调的URL。特别要注意的是返回参数是xml输入流
HttpServletRequest request = getRequest();
* 获取用户扫描二维码后,微信返回的信息
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
outSteam.close();
inStream.close();
String result
= new String(outSteam.toByteArray(),&utf-8&);
System.out.println(&callBack_xml&&&&+result);
&appid&&![CDATA[wx5ef64cd]]&&/appid&
&openid&&![CDATA[o_pncsidC-pRRfCP4zj98h6slREw]]&&/openid&
&mch_id&&![CDATA[商户ID]]&&/mch_id&
&is_subscribe&&![CDATA[Y]]&&/is_subscribe&
&nonce_str&&![CDATA[gT5NJAlv9eXawn1j]]&&/nonce_str&
&product_id&&![CDATA[001]]&&/product_id&
&sign&&![CDATA[D2BDBB43D66]]&&/sign&
4、根据回调参数生成预付订单进行支付
根据回调参数调用生成预支付交易的prepay_id
prepay_xml&&&
&xml&&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[OK]]&&/return_msg&
&appid&&![CDATA[微信的appid]]&&/appid&
&mch_id&&![CDATA[商户ID]]&&/mch_id&
&nonce_str&&![CDATA[p46NAoD82eAH2d9j]]&&/nonce_str&
&sign&&![CDATA[33DC8F72D]]&&/sign&
&result_code&&![CDATA[SUCCESS]]&&/result_code&
&prepay_id&&![CDATA[wx007cb1cbe40b]]&&/prepay_id&
&trade_type&&![CDATA[NATIVE]]&&/trade_type&
&code_url&&![CDATA[weixin://wxpay/bizpayurl?pr=QCLqJIG]]&&/code_url&
商户后台系统将prepay_id返回给微信支付系统,微信支付系统根据交易会话标识,发起用户端授权支付流程。
* 发送信息给微信服务器
Map&String, String& payResult = PaymentKit.xmlToMap(xmlResult);
String return_code = payResult.get(&return_code&);
String result_code = payResult.get(&result_code&);
if (StrKit.notBlank(return_code) && StrKit.notBlank(result_code) && return_code.equalsIgnoreCase(&SUCCESS&)&&result_code.equalsIgnoreCase(&SUCCESS&)) {
// 以下字段在return_code 和result_code都为SUCCESS的时候有返回
String prepay_id = payResult.get(&prepay_id&);
Map&String, String& prepayParams = new HashMap&String, String&();
prepayParams.put(&return_code&, &SUCCESS&);
prepayParams.put(&appId&, appid);
prepayParams.put(&mch_id&, mch_id);
prepayParams.put(&nonceStr&, System.currentTimeMillis() + &&);
prepayParams.put(&prepay_id&, prepay_id);
String prepaySign =
if (sign.equals(packageSign)) {
prepayParams.put(&result_code&, &SUCCESS&);
prepayParams.put(&result_code&, &FAIL&);
prepayParams.put(&err_code_des&, &订单失效&);
//result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息
prepaySign = PaymentKit.createSign(prepayParams, paternerKey);
prepayParams.put(&sign&, prepaySign);
String xml = PaymentKit.toXml(prepayParams);
log.error(xml);
renderText(xml);
5、支付结果通用通知
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/00/,单位:秒)
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。
技术人员可登进微信商户后台扫描加入接口报警群。
此通知接收地址为生成预付订单时设置的notify_url 。在中通知默认的地址为http://域名[/项目名称]/pay/pay_notify
以上是微信扫码支付模式一的全过程。
扫码支付模式二
模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付。
微信支付的统一下单接口具体实现上文也有提及到,如果还不是很清楚可以看 com.javen.weixin.controller.WeixinPayController中的scanCode2 以及
以下是调用预付订单返回的xml
&xml&&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[OK]]&&/return_msg&
&appid&&![CDATA[wx5ef64cd]]&&/appid&
&mch_id&&![CDATA[]]&&/mch_id&
&nonce_str&&![CDATA[XdVf2zXLErIHRfJn]]&&/nonce_str&
&sign&&![CDATA[CC4A9E4C3337]]&&/sign&
&result_code&&![CDATA[SUCCESS]]&&/result_code&
&prepay_id&&![CDATA[wx]]&&/prepay_id&
&trade_type&&![CDATA[NATIVE]]&&/trade_type&
&code_url&&![CDATA[weixin://wxpay/bizpayurl?pr=WWOXnrb]]&&/code_url&
其中code_url 就是生成二维码的链接
String qrCodeUrl = result.get(&code_url&);
String name = &payQRCode1.png&;
Boolean encode = ZxingKit.encode(qrCodeUrl, BarcodeFormat.QR_CODE, 3, ErrorCorrectionLevel.H, &png&, 200, 200,
PathKit.getWebRootPath()+File.separator+&view&+File.separator+name );
if (encode) {
//在页面上显示
setAttr(&payQRCode&, name);
render(&payQRCode.jsp&);
扫码即可进行支付,code_url有效期为2小时,过期后扫码不能再发起支付
最终生成二维码访问地址为http://域名[/项目名称]/pay/scanCode2
码字完毕,以上就是微信扫码支付(模式一、模式二)的详细介绍。
欢迎留言、转发
微信极速开发系列文章:
后续更新预告
1、刷卡支付
2、微信红包
3、企业转账
阅读(...) 评论()
友情链接:携程开启PC端微信支付功能 扫码即可支付
作者:范晓东
[导读]后续携程还会将微信支付添加到携程旅游客户端,微信支付的大军日益壮大。
携程开启PC端微信支付功能 扫码即可支付
腾讯科技讯(范晓东)2月19日消息,携程旅行网于今日宣布正式开启其PC端的微信支付服务,后续该服务将进一步延伸到携程旅行客户端。携程官方称,希望通过其网站和手机端实现微信支付功能为旅游消费群体带来全新的支付体验。
微信5.0推出微信支付以来,用户只需在微信&我的银行卡&选项中关联一张银行卡,并完成身份认证,即可将装有微信App的智能手机变成一个全能钱包,之后可购买合作商户的商品及服务。
据了解,微信支付分为扫码支付、App内支付和公众号支付三种。携程旅行网PC端针对的支付方法为扫码支付,即用微信&扫一扫&扫描二维码进入微信支付页面付款。
为了促进用户积极使用微信支付功能,携程旅行网将推出众多营销方式来吸引眼球,目前有计划进行的将是&抽奖&和&返现&礼包。据悉,携程旅行网已于今日推出&用微信支付赢双人邮轮游&活动,将在微信支付用户中随机抽取大奖,活动时间为2月19日至3月31日。
据悉,随着微信支付第三方平台的不断扩大,国内线上线下的众多商户都迅速跟进,纷纷涉足微信支付业务。易迅、当当、优酷、大众点评等众多企业均已接入。
官方微博/微信
每日头条、业界资讯、热点资讯、八卦爆料,全天跟踪微博播报。各种爆料、内幕、花边、资讯一网打尽。百万互联网粉丝互动参与,TechWeb官方微博期待您的关注。
↑扫描二维码
想在手机上看科技资讯和科技八卦吗?想第一时间看独家爆料和深度报道吗?请关注TechWeb官方微信公众帐号:1.用手机扫左侧二维码;2.在添加朋友里,搜索关注TechWeb。
相关的资讯有:
相关的博文有:
最近OPPO官方公布了OPPO R11s手机的信息,OPPO作为国内手机销量前三甲之一,很有可能...
随着智能手机发展,手机摄像头的性能节节攀升,像素越来越高,规格越来越强,也从单摄...
9月21日,vivo在北京居庸关长城发布了X20和X20 Plus,其中vivo X20已经正式上市有一段...
据SK海力士(SK Hynix)今日发布的一份声明显示,收购东芝芯片业务部门后,贝恩资本(Bai...
监管文件显示,科斯罗萨西周四通知纽约时报公司董事会,他将因为出任Uber的新职位而卸...
一名美国法官已责令进行一项新的审判,目的是判定三星应因其抄袭苹果公司iPhone外观设...
Windows 10秋季创意者更新已经正式发布,并开始全球陆续推送,但是Windows 10装机量已...
小米A1是小米与Google合作推出的第一款Android One项目机型,搭载了原生Android操作系...
在 Mac 电脑遇到问题的时候,联系苹果客服可以很快解决问题。锋友 Ethan丨King 日前表...
在体验服开放了小鹿男副本“觉醒的意志”,包括了奖励新皮肤:隐鳞山海,......
传说万圣之夜的化装舞会上,会有真正的魔女出没。如果有人问你要糖果,随便拒绝的话可......
王者荣耀今天S9赛季正式上线,那么究竟都更新了什么限免英雄?我们就一起来看看啊!......
《绝地求生大逃杀》中的四排是需要有一些战术策略的,这样团队合作才能发挥出较好的效......
Copyright (C)
All rights reserved.
请选择一张图片分享
要转发到新浪微博,请
要转发到QQ空间,请博客分类:
支付申请说明参考:
微信扫码支付可分为两种模式,本示例选择模式二,具体流程及API文档参考:
下面仅说明服务端的实现,主要包含两部分:
一、根据客户端请求生成内部订单信息,然后调用微信统一下单API,得到预支付交易链接(二维码图片地址),返回给客户端
可参看前一篇文章:
1、前端H5页面请求服务端生成唯一订单号(包括用户信息,支付金额,商品信息等),服务端在数据库创建一条新记录
2、前端H5页面请求服务端Perl CGI脚本进行支付: 例如https:/xxxx/cgi-bin/pay.pl?do=qrcodepay&order_id=xxxxxxx&openid=xxxxxx
////脚本处理
if ($cgi-&param('do') eq "qrcodepay") {
3、CGI脚本调用接口访问数据库,获取支付记录信息,调用微信统一下单接口
与H5公众号支付区别的几个参数如下:
if ($qrcode) {#PC扫码支付
$PayInfo-&{service}= "pay.weixin.native";
} else {#公众号内支付必须传sub_openid
$PayInfo-&{sub_openid} = $
$PayInfo-&{service}= "pay.weixin.jspay";
4、服务端得到二维码链接code_url、code_img_url后,CGI重定向到H5指定的页面,客户端向用户展示二维码
my $redirect_url = "http://xxxx/recharge_pay.html?order_id=$order_id&RMB=$order_info-&{rmb}&code_url=$code_url&code_img_url=$code_img_url";
print $cgi-&redirect($redirect_url);
二、用户扫码支付后,微信服务器向notify_url指定的回调地址通知支付结果
*三、支付成功后如何通知前端(PC端)页面进行刷新?
方式一、可以定时访问服务端的某个接口,根据订单号获取支付状态
方式二、如果客户端和服务端通信的协议支持长连接,比如websocket,那么服务端收到微信服务器的notify通知后,就可以采取推送消息给客户端,让客户端刷新页面
浏览: 142311 次
来自: 厦门
我的项目有时候也会出现连接失败的情况,报错如下,跟你的优点像, ...
这个都是2009年的事了,估计当时的rails版本2.3.0比 ...
这个都是2009年的事了,估计当时的rails版本2.3.0比 ...
好文,抚慰我们的心灵!
太复杂了,这里有更简单的。/ ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 java实现微信扫码支付 的文章

 

随机推荐