EverydayOneCat
Do Not Swim🚫
微信扫码支付简介
1.二维码
1.1什么是二维码
二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
1.2二维码优势
- 信息容量大, 可以容纳多达1850个大写字母或2710个数字或500多个汉字
- 应用范围广, 支持文字,声音,图片,指纹等等…
- 容错能力强, 即使图片出现部分破损也能使用
- 成本低, 容易制作
1.3二维码容错级别
L级(低) 7%的码字可以被恢复。
M级(中) 的码字的15%可以被恢复。
Q级(四分)的码字的25%可以被恢复。
H级(高) 的码字的30%可以被恢复。
1.4二维码生成插件qrious
qrious是一款基于HTML5 Canvas的纯JS二维码生成插件。通过qrious.js可以快速生成各种二维码,你可以控制二维码的尺寸颜色,还可以将生成的二维码进行Base64编码。
qrious.js二维码插件的可用配置参数如下:
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
background | String | “white” | 二维码的背景颜色。 |
foreground | String | “black” | 二维码的前景颜色。 |
level | String | “L” | 二维码的误差校正级别(L, M, Q, H)。 |
mime | String | “image/png” | 二维码输出为图片时的MIME类型。 |
size | Number | 100 | 二维码的尺寸,单位像素。 |
value | String | “地址” | 需要编码为二维码的值 |
案例:
1 | <html> |
2.微信支付
2.1开发文档
在线微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
微信支付接口调用的整体思路:
按API要求组装参数,以XML方式发送(POST)给微信支付接口(URL),微信支付接口也是以XML方式给予响应。程序根据返回的结果(其中包括支付URL)生成二维码或判断订单状态。
需要四个参数:
appid:微信公众账号或开放平台APP的唯一标识
mch_id:商户号 (配置文件中的partner)
partnerkey:商户密钥
sign:数字签名, 根据微信官方提供的密钥和一套算法生成的一个加密信息, 就是为了保证交易的安全性
2.2微信支付SDK
使用微信支付SDK,在maven工程中引入依赖
1 | <dependency> |
我们主要会用到微信支付SDK的以下功能:
1 | //(1)获取随机字符串 |
2.3HttpClient工具类
之前的博客中已经有过对HttpClient有过介绍,这里就简单说一下使用方法:
1 | HttpClient client=new HttpClient(请求的url地址); |
品优购实现微信支付
1.微信支付二维码生成
我们通过HttpClient工具类实现对远程支付接口的调用。
接口链接:https://api.mch.weixin.qq.com/pay/unifiedorder
具体参数参见“统一下单”API, 构建参数发送给统一下单的url ,返回的信息中有支付url,根据url生成二维码,显示的订单号和金额也在返回的信息中。
1.1服务层
1 |
|
1.2控制层
这里我们订单号通过分布式ID生成器生成,金额暂时写死,后续开发我们再对接业务系统得到订单号和金额
1 | /** |
1.3前端实现
创建payService.js
1 | app.service('payService',function($http){ |
创建payController.js
1 | app.controller('payController' ,function($scope ,payService){ |
设置二维码图片的ID
1 | <p class="red"></p> |
2.检测支付状态
我们通过HttpClient工具类实现对远程支付接口的调用。
接口链接:https://api.mch.weixin.qq.com/pay/orderquery
具体参数参见“查询订单”API, 我们在controller方法中轮询调用查询订单(间隔3秒),当返回状态为success时,我们会在controller方法返回结果。前端代码收到结果后跳转到成功页面。
2.1服务层
1 |
|
2.2控制层
1 | /** |
2.3前端实现
payService.js新增方法
1 | //查询支付状态 |
payController.js中新增方法
1 | //查询支付状态 |
2.4查询时间限制
如果用户到了二维码页面一直未支付,或是关掉了支付页面,我们的代码会一直循环调用微信接口,这样会对程序造成很大的压力。所以我们要加一个时间限制或是循环次数限制,当超过时间或次数时,跳出循环。
修改pinyougou-cart-web工程PayController.java的queryPayStatus方法
1 |
|
修改payController.js
1 | //查询支付状态 |
2.5支付成功页面显示金额
现在我们支付成功页面显示的是固定的值,怎么显示真正的支付金额呢?我们这里可以使用angularJS的页面传参来解决。
修改payController.js 跳转页面传参
1 | if(response.success){ |
在payController.js中引入$location服务 ,新增方法
1 | //获取金额 |
用表达式显示金额
1 | <p>支付金额:¥{{getMoney()}}元</p> |
3.支付日志
3.1实现思路
(1)在用户下订单时,判断如果为微信支付,就想支付日志表添加一条记录,信息包括支付总金额、订单ID(多个)、用户ID 、下单时间等信息,支付状态为0(未支付)
(2)生成的支付日志对象放入redis中,以用户ID作为key,这样在生成支付二维码时就可以从redis中提取支付日志对象中的金额和订单号。
(3)当用户支付成功后,修改支付日志的支付状态为1(已支付),并记录微信传递给我们的交易流水号。根据订单ID(多个)修改订单的状态为2(已付款)。
3.2插入日志记录
修改pinyougou-order-service工程OrderServiceImpl.java 的add方法。
内容:判断如果支付方式为微信支付,向数据库插入支付日志记录,并放入redis存储
1 |
|
3.3读取支付日志
OrderServiceImpl.java实现方法
1 |
|
修改PayController.java的createNative方法
实现思路:调用获取支付日志对象的方法,得到订单号和金额
1 |
|
3.4修改订单状态
服务层OrderServiceImpl.java实现
1 | /** |
控制层PayController.java。在微信支付接口有成功返回状态时,调用修改状态的方法
1 | if(map.get("trade_state").equals("SUCCESS")){//如果成功 |
结语
冷知识:LPL至今还没队伍在入围赛出局过
《空ban》真的是经典 LGD又要创造历史了?🐂