二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
容错级别也就是容错率, 相当于部分二维码被遮挡仍然可以被扫描出来.
L级(低) 7%的码字可以被恢复。
M级(中) 的码字的15%可以被恢复。
Q级(四分)的码字的25%可以被恢复。
H级(高) 的码字的30%可以被恢复。
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 “” 需要编码为二维码的值
下面的代码即可生成一张二维码
<html>
<head>
<title>二维码入门小demotitle>
head>
<body>
<img id="qrious">
<script src="qrious.min.js">script>
<script>
var qr = new QRious({
element:document.getElementById('qrious'),
size:250,
level:'H',
value:'https://www.baidu.com'
});
script>
body>
html>
大家掏出手机,扫一下看看是否会看到百度的官网呢?
微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
申请步骤:(了解)
第一步:注册公众号(类型须为:服务号)
请根据营业执照类型选择以下主体注册:个体工商户| 企业/公司| 政府| 媒体| 其他类型。
第二步:认证公众号
公众号认证后才可申请微信支付,认证费:300元/次。
第三步:提交资料申请微信支付
登录公众平台,点击左侧菜单【微信支付】,开始填写资料等待审核,审核时间为1-5个工作日内。
第四步:开户成功,登录商户平台进行验证
资料审核通过后,请登录联系人邮箱查收商户号和密码,并登录商户平台填写财付通备付金打的小额资金数额,完成账户验证。
第五步:在线签署协议
本协议为线上电子协议,签署后方可进行交易及资金结算,签署完立即生效。
本课程已经提供好微信支付账号,学员无需申请。
微信支付接口调用的整体思路:
按API要求组装参数,以XML方式发送(POST)给微信支付接口(URL),微信支付接口也是以XML方式给予响应。程序根据返回的结果(其中包括支付URL)生成二维码或判断订单状态。
在线微信支付开发文档:
https://pay.weixin.qq.com/wiki/doc/api/index.html
如果你不能联网,请查阅讲义配套资源 (10配套软件\微信扫码支付)
我们在本章课程中会用到”统一下单”和”查询订单”两组API
1.appid:微信公众账号或开放平台APP的唯一标识
2.mch_id:商户号 (配置文件中的partner)
3.partnerkey:商户密钥
4.sign:数字签名, 根据微信官方提供的密钥和一套算法生成的一个加密信息, 就是为了保证交易的安全性
第一步: 微信支付提供了SDK, 大家下载后打开源码,install到本地仓库。
第二步:使用微信支付SDK,在maven工程中引入依赖
com.github.wxpay
wxpay-sdk
0.0.3
我们主要会用到微信支付SDK的以下功能:
(1)获取随机字符串
WXPayUtil.generateNonceStr()
(2)MAP转换为XML字符串(自动添加签名)
WXPayUtil.generateSignedXml(param, partnerkey)
(3)XML字符串转换为MAP
WXPayUtil.xmlToMap(result)
HttpClient现在用不上,过去用的很多(支付sdk又升级了)
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
HttpClient通俗的讲就是模拟了浏览器的行为,如果我们需要在后端向某一地址提交数据获取结果,就可以使用HttpClient.
关于HttpClient(原生)具体的使用不属于我们本章的学习内容,我们这里这里为了简化HttpClient的使用,提供了工具类HttpClient(对原生HttpClient进行了封装)
HttpClient工具类使用的步骤
HttpClient client=new HttpClient(请求的url地址);
client.setHttps(true);//是否是https协议
client.setXmlParam(xmlParam);//发送的xml数据
client.post();//执行post请求
String result = client.getContent(); //获取结果
(1)在common工程中添加工具类HttpClient.java
(2)添加配置文件weixinpay.properties
appid=****
partner=****
partnerkey=****
notifyurl=http://a31ef7db.ngrok.io/WeChatPay/WeChatPayNotify
appid: 微信公众账号或开放平台APP的唯一标识
partner:财付通平台的商户账号
partnerkey:财付通平台的商户密钥
notifyurl: 回调地址
(3)将二维码插件QRious 拷贝到项目中,根据微信显示的code_url(二维码地址),在网页中显示二维码
代码如下:
第一配置类:
/**
* springboot开发, 所以提供
*/
public class MyConfig extends WXPayConfig {
String getAppID() {
return "*****";//商家id
}
String getMchID() {
return "*****";//公众号id
}
String getKey() {
return "*****";//密钥
}
InputStream getCertStream() {
return null;
}
IWXPayDomain getWXPayDomain() {
return new IWXPayDomain() {
public void report(String s, long l, Exception e) {
}
public DomainInfo getDomain(WXPayConfig wxPayConfig) {
return new DomainInfo("api.mch.weixin.qq.com",true);
}
};
}
}
第二步: 支付测试代码
/**
* 微信扫码支付:
* 1.提交请求参数: 订单id,用户id,订单金额等等
* 2.后台调用微信支付的统一下单方法
* 生成一个code_url=二维码地址
* 包含: 订单id,用户id,订单金额,公众号id,商家id等
* 3. 在前端页面拿到code_url ,展示二维码
* 4. 用户拿出手机,扫码支付
* 5. 可以调用微信支付的查询订单方法: 订单的支付状态
*
* 代码实现:
* 1. 将微信支付的sdk(源码),打成jar包,maven安装到本地仓库
* 2. 使用微信支付的核心api
* * WXConfig: 配置类,用作配置支付参数
* 可以用yml文件配置支付参数
* * WXPay: 统一下单(生成二维码),查询订单的方法
*
*/
public class WXPayDemo {
public static void main(String[] args) throws Exception{
//1.开通微信支付时, 返回三个参数
MyConfig myConfig = new MyConfig();
WXPay wx = new WXPay(myConfig);
Map<String,String> map = new HashMap<String,String>();
map.put("body","商品秒杀");
map.put("out_trade_no","113399ss9");//订单号1133, 支付一次()
map.put("total_fee","1");//分为单位
map.put("spbill_create_ip","127.0.0.1");
map.put("notify_url","http://a31ef7db.ngrok.io/WeChatPay/WeChatPayNotify");
map.put("trade_type","NATIVE");
Map<String, String> map1 = wx.unifiedOrder(map);//下单的方法
System.out.println(map1.toString());
}
}