一.微信支付介绍
1.微信扫码支付申请
申请步骤:(了解)
在线微信支付开发文档:
https://pay.weixin.qq.com/wiki/doc/api/index.html
第一步:注册公众号(类型须为:服务号)
第二步:认证公众号
第三步:提交资料申请微信支付
第四步:开户成功,登录商户平台进行验证
第五步:在线签署协议
最后微信会返回给商户一些参数,用于调用微信接口
(1) appid:微信公众账号或开放平台APP的唯一标识
(2)mch_id:商户号 (配置文件中的partner)
(3)partnerkey:商户密钥
微信支付接口调用的整体思路:
按API要求组装参数,以XML方式发送(POST)给微信支付接口(URL),微信支付接口也是以XML方式给予响应。程序根据返回的结果(其中包括支付URL)生成二维码或判断订单状态。
2.微信支付SDK
我们主要会用到微信支付SDK的以下功能:
(1)获取随机字符串
WXPayUtil.generateNonceStr()
(2)MAP转换为XML字符串(自动添加签名)
WXPayUtil.generateSignedXml(param, partnerkey)
(3)XML字符串转换为MAP
WXPayUtil.xmlToMap(result)
微信maven依赖
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
二、微信支付开发(使用Native的方式,通过扫描二维码完成付款)
1.微信支付的开发流程
(1)通过请求微信Api接口获取对应的支付二维码路径,前端通过代码将二维码进行显示给客户.
(2)本该是微信服务器自动调用(1)步中参数公网地址返回支付结果,由于在本项目为申请公网地址,所以改为自己通过循环请求,向微信 接口查询本次支付的状态.
(3)查询微信支付结果成功,进行后续业务处理.
2.微信支付的开发操作
(1)获取二维码
准备访问微信获取二维码接口所需的参数Map,通微信提供的工具类(WXPayUtil.generateSignedXml(param, partnerkey))将Map转换为xml字符串(微信规定),使用HttpClient访问微信接口,得到响应参数xml字符串,使用WXPayUtil.xmlToMap(result)将Xml字符串转换为Map,提取出需要的数据并封装返回给前端(微信二维码路径code_url)
具体请求所需参数以及返回参数的有哪些数据请参考上方链接微信官网
//设置访问微信接口所需的数据
Map paramMap = new HashMap();
paramMap.put("appid",weiXinConfig.getAppid());//向微信申请的微信公众账号或开放平台APP的唯一标识
paramMap.put("mch_id",weiXinConfig.getPartner());//向微信申请的商户号
paramMap.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串
Date reserveDate = orderInfo.getReserveDate();
String reserveDateStr = new DateTime(reserveDate).toString("yyyy/MM/dd");
String body = reserveDateStr+"就诊"+orderInfo.getDepname();
paramMap.put("body",body);
paramMap.put("out_trade_no",orderInfo.getOutTradeNo());//交易订单号
paramMap.put("total_fee", order.getAmount().multiply(new BigDecimal("100")).longValue()+"");
paramMap.put("total_fee", "1");//为了测试使用1分钱的数据
paramMap.put("spbill_create_ip", "127.0.0.1");//pos机使用的,随便设置
paramMap.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify");//回调地址,需要公网地址,由于条件限制无公网ip所以随便写,通过第步查询支付状态,查看是否支付成功
paramMap.put("trade_type", "NATIVE");
//HttpClient来根据URL访问第三方接口并且传递参数
HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
//clients设置参数
try {
httpClient.setXmlParam(WXPayUtil.generateSignedXml(paramMap,weiXinConfig.getPartnerkey()));//Partnerkey为向微信申请的商户密匙
httpClient.setHttps(true);
httpClient.post();
//返回第三方数据
String content = httpClient.getContent();
Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
//封装结果返回集
Map<String, Object> map = new HashMap<>();
map.put("orderId", orderId);
map.put("totalFee", orderInfo.getAmount());
map.put("resultCode", resultMap.get("result_code"));
map.put("codeUrl", resultMap.get("code_url"));
return map;
(2)查询微信支付状态
(条件限制,需要前端设置循环任务,知道访问结果为支付成功为止)
原理同上,所需的请求参数不同,响应返回参数不同,具体参数请参考文章开头地址,微信官方文档
//通过数据库获取订单信息
OrderInfo orderInfo = orderInfoService.getById(orderId);
//封装微信查询所需要的参数
Map paramMap = new HashMap();
paramMap.put("appid", weiXinConfig.getAppid());
paramMap.put("mch_id", weiXinConfig.getPartner());
paramMap.put("out_trade_no", orderInfo.getOutTradeNo());
paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
//设置请求
HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
try {
client.setXmlParam(WXPayUtil.generateSignedXml(paramMap,weiXinConfig.getPartnerkey()));
client.setHttps(true);
client.post();
//获取返回数据
String content = client.getContent();
Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
//返回
return resultMap;
(3)微信支付成功,进行下一步业务操作.