关于微信支付,大家都知道电商平台基本上都要使用到微信相关支付,
在手机上我们支付流程很清晰简单,用户直接选择商品然后,立刻付款就可以完成,
那么我们来看看在后台是怎么来实现这个过程的,这里直接进入主题
我这里是使用的springboot的项目,但是用发都差不多,没有统一的方法,只有适合自己的方法。
1、在application中加入以下配置
#支付配置
#微信商户平台
wxpay.mer_id=5465854500
wxpay.key=XXXXXXX3tJ6XXXXs30e22XXXXXSwo //这个key是需要自己去注册成为微信商家才可以得到
wxpay.callback= http://99568e2a.ngrok.io/api/v1/wechat/order/callback
注意:99568e2a.ngrok.io为ngrok随机生成的域名,这里必须要使用项目运行的端口来生成域名,然后前端访问ip也是使用ngrok生的域名,要与这里一样才可以2、创建微信配置类在WeChatConfig中加入以下:
/**
* 商户号id
*/
@Value("${wxpay.mer_id}")
private String mchId;
/**
* 支付key
*/
@Value("${wxpay.key}")
private String key;
/**
* 微信支付回调url
*/
@Value("${wxpay.callback}")
private String payCallbackUrl;
/**
* 统一下单url,这里用于微信下单支付成功以后,返回数据
*/
private static final String UNIFIED_ORDER_URL = "https://api.xx.net/pay/unifiedorder"; //api.xx.net为支付网关域名 domain
2、这里讲解一下支付流程,举个例子:
1、首先点击购买,我们要这个时候完成统一统一下单
2、统一下单步骤:(查询我们都是通过订单子表(就是继承了订单表)来查询的,订单表包含了用户及商品订单ID)
1、创建接口:public String save(VideoOrderDto videoOrderDto)
2、首先根据商品的ID去查寻到商品的信息
3、在根据用过户ID查询到用户ID
4、有了上面用户于商品的信息就可以生成订单了,订单表中有一个流水号,微信平台那边要求用UUID生成,所以要创建一个UUID工具
5、调用订单表的添加方法,完成下单,但是注意这个订单是一个为支付带订单,所以当后面完成订单以后,还要去修改订单状态
3、创建一个统一下单接方法: private String unifiedOrder(VideoOrder videoOrder)
1、我们要通过SortedMap<String,String> params=new TreeMap<>(); //完成签名的生成,微信平台需要的将信息都存入params,注意微信的回调地址也在里面,加
2、生成签名的算法原理:将订单中的信息一个一个追加+支付key生成sign, 然后见sign通过MD5加密返回
3、将sign 存入params中
4、将map格式的params转成xml格式
5、向微信平发楚统一下请求:HttpUtils.doPost(WeChatConfig.getUnifiedOrderUrl(),payXml,4000);
HttpUtils.doPost://是一个http请求协议工具
getUnifiedOrderUrl() ://是 统一下单url,就是上面提供的UNIFIED_ORDER_URL
payXml://就是params转成的xml格式
4000://就是请求时间不超过4秒
4、完成上面三个以后:请求统一下单以后微信会返回一个xml格式的数据orderStr
1、校验该数是否为空,为空放返回null
2、不为空,将数据orderStr转成map格式,如为:unfiedOrderMap
3、我们从unfiedOrderMap.get("code_url");获取到code_url,返回给unifiedOrder
5、unifiedOrder得到返回得code_url以后,返回给controller中:
因为我们得二维码是在controller生成得,这个得看自己,你也可以封装成一个工具
1、在applaction.prporties中加入以下依赖后
<!-- google二维码生成包 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.0</version>
</dependency>
2、生成二维码:将返回的code_url传入
//生成二维码配置
Map<EncodeHintType,Object> hints = new HashMap<>();
//设置纠错等级
hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.L);
//编码类型
hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(codeUrl,BarcodeFormat.QR_CODE,400,400,hints);
OutputStream out = response.getOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix,"png",out);
6、用户扫码支付成功以后,微信平台会回调刚刚我们提供的回调地址,就会去访问这个接口
1、首先我们得知道回调接口是干嘛用?:用于更新订单状态
2、我们要从微信放回的流中拿出数据,将数据全部取出来,转成map格式
3、我们通过支付key于map格式的数据来进行判断签名是否真确,调用校验工具接口WXPayUtil.getSortedMap(callbackMap);
4、判断是否支付成功,"SUCCESS".equals(sortedMap.get("result_code")
5、获取流水号:sortedMap.get("out_trade_no");用来查询到相应的订单信息
6、更新订单数据,如果处理成功,返回通知微星平台
7、 int rows = videoOrderService.updateVideoOderByOutTradeNo(videoOrder);
if(rows == 1){ //通知微信订单处理成功
response.setContentType("text/xml");
response.getWriter().println("success");
return;
}