目录
一.支付方式
二.Native支付
1.业务流程时序图
2.关键代码
2.1利用google提供的矩阵对象生成二维码
2.2提交请求参数为XML方式的请求
2.3业务controller
1.付款码支付
付款码支付是用户展示付款码,然后商家通过扫描用户的付款码来完成支付。
2.Native支付
Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
订单金额商家指定,用户扫描后不能更改支付金额。
总结特点∶生成的二维码是微信的URL地址扫描二维码直接打开微信客户端完成支付
3.JSAPI支付
JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
4.微信小程序支付
小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。
5.APP支付
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
6.H5支付
H5支付主要是在手机、ipad等移动设备中通过浏览器来唤起微信支付的支付产品。总结特点:H5支付与JSAPI支付的区别在于H5支付不要求在微信客户端打开H5页面。
7.刷脸支付
用于线下消费场景,无需提前录入人脸,无需拿出手机,在支持微信刷脸支付的机具上,刷脸并输入手机号验证,即可完成付款,使用方便。使用专用3D活体检测摄像头,安全性高。
/**
* 生成二维码
* @throws WriterException
* @throws IOException
*/
public static String generateQRCode(String code_url) throws WriterException, IOException {
//生成二维码
//设置二维码的尺寸
int width = 200;
int hight = 200;
//创建map
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
//创建矩阵对象 调用谷歌提供的
BitMatrix bitMatrix = new MultiFormatWriter().encode(code_url, BarcodeFormat.QR_CODE, width, hight, hints);
//创建二维码生成路径
String filePath = "d://QRCode//";
String fileName = RandomStringUtils.randomAlphanumeric(10)+ ".jpg";
Path path = FileSystems.getDefault().getPath(filePath,fileName);
//将创建的矩阵转换成图片
MatrixToImageWriter.writeToPath(bitMatrix,"jpg",path);
return fileName;
}
/**
* 请求参数为XML格式的Post请求
* @param url
* @param requestDataXml
* @return
*/
public static String doPostByXml(String url, String requestDataXml) {
CloseableHttpClient httpClient = null;
//创建响应对象
CloseableHttpResponse httpResponse = null;
//创建httpClient连接对象
httpClient = HttpClients.createDefault();
//创建post请求连接对象
HttpPost httpPost =new HttpPost (url) ;
//创建连接请求参数对象,并设置连接参数
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout (15000)//连接服务器主机超时时间
.setConnectionRequestTimeout (60000)//连接请求超时时间
.setSocketTimeout (60000)//设置读取响应数据超时时间
.build();
//为httpPost请求设置参数
httpPost.setConfig (requestConfig);
//将想上传的数据存放在HttpPost 的entity属性中
//new StringEntity会将字符串转为HttpEntity类型
httpPost.setEntity(new StringEntity(requestDataXml,"utf-8"));
//添加头信息
httpPost.addHeader("Content-Type","text/xml");
String responseDataXml = null;
//发送请求
try {
httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
//将HttpEntity类型的数据转为String
responseDataXml = EntityUtils.toString(entity);
} catch (IOException e) {
e.printStackTrace();
}
return responseDataXml;
}
@PostMapping("/recharge/towx")
public String toWxPayRecharge(HttpServletRequest request, @RequestParam("money")Integer money) throws Exception {
//模拟session数据
JSONObject data = new JSONObject();
data.put("userId",1);
data.put("userName","ws");
request.getSession().setAttribute("userInfo",data);
//从session中获取信息
JSONObject user = new JSONObject();
user = (JSONObject) request.getSession().getAttribute("userInfo");
// System.out.println(user);
//模拟生成订单号
String orderId = Util.creatOrderId();
//模拟生成充值记录
Map rechargeMap = new HashMap<>();
rechargeMap.put("orderId", orderId);
rechargeMap.put("userId", user.get("userId"));
rechargeMap.put("rechargeMoney", money);
rechargeMap.put("rechargeType", "微信支付");
// System.out.println(rechargeMap);
//准备微信统一接口参数
Map requestDataMap = new HashMap<>();
//生成随机字符串
String nonceStr = WXPayUtil.generateNonceStr();
//创建商品描述
String body = "ccc";
//订单金额 ,单位为分
String total_fee = money * 100 +"";
//获取终端ip
String hostAddress = null;
try {
InetAddress localAddress = InetAddress.getLocalHost();
hostAddress = localAddress.getHostAddress();
// System.out.println(hostAddress);
} catch (UnknownHostException e) {
e.printStackTrace();
}
requestDataMap.put("appid","wx8a3fcf509313fd74");//微信公众平台id
requestDataMap.put("mch_id","1361137902"); //商户号
requestDataMap.put("nonce_str", nonceStr);//随机字符串
requestDataMap.put("body",body); //商品描述
requestDataMap.put("out_trade_no", orderId);//商户订单号
requestDataMap.put("total", total_fee); //订单金额 单位分
requestDataMap.put("spbill_create_ip", hostAddress);//用户的客户端ip
//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,
//不能携带参数。 公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http
requestDataMap.put("notify_url","http//localhost:8888/wxpayNotityUrl");//接收微信支付结果通知的回调地址
requestDataMap.put("trade_type", "NATIVE");//支付类型 Native
requestDataMap.put("product_id", orderId);//商品id
requestDataMap.put("sign_type","MD5");//签名
//生成签名 注意!!key是api密匙是微信商户平台的 不要写成APPsecret
String sign = WXPayUtil.generateSignature(requestDataMap,"367151c5fd0d50f1e34a68a8o2d6bbca");
requestDataMap.put("sign",sign);//签名
//按要求需要创建xml格式字符串
String requestDataXml = WXPayUtil.mapToXml(requestDataMap);
System.out.println(requestDataXml);
System.out.println("11111");
//调用微信统一下单api 将该xml字符串传入 得到一个xml格式的结果
String responseDataXml = HttpClientUtil.doPostByXml("https://api.mch.weixin.qq.com/pay/unifiedorder",requestDataXml);
Map responseDataMap = WXPayUtil.xmlToMap(responseDataXml);
System.out.println(responseDataMap);
//把返回得到的xml中中的连接当作字符串就生成二维码即可
//生成二维码
String picName = null;
String code_url = "weixin :/lwxpay/bizpayur1?pr=8b1YoPw";
try {
picName = Util.generateQRCode(code_url);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//把生成二维码的文件名放在request中
HttpSession session = request.getSession();
session.setAttribute("picName", picName);
//完整路径名
String path = "/QRCode/" + picName;
session.setAttribute("path", path);
//假设充值一定成功
//跳转到展示二维码的界面
return "showQRCode";
}