Java接入微信支付超级详细教程——从入门到精通
源码下载
一、准备开发所需的账号以及配置信息
上面两个平台注册完成之后就需要把配置信息拿到了:
图1
2、Api_key: 应用密钥,查看 ”图1“
3、mch_Id:商户ID (收钱的商家ID),查看 ”图2“
图2
二、准备环境
项目采用SpringBoot
1、导入jar包
1.2导入hutool工具类jar包
<!-- hutool --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.2</version> </dependency>
2、设置开发参数
在application.yml,设置号开发参数
3、参数注入到payProperties类中
三、预下单
本项目返回参数为了方便我都是用的Map(实际开发中禁用),我这是为了方便不想写实体类,嘿嘿…
要完成支付那肯定我们需要先下一笔订单把,没订单客户咋付钱,所以先“预下单”
官方文档:
2、预下单接口封装服务类
解释:
这样接口层就写好了,接下来可以使用 进行调用了
3、测试调用“预下单”
本次交易类型为:NATIVE-二维码支付
参数疑惑解释:
Sub_mch_id:子商户的商户号(真正收钱的商家),这个参数只在”服务商模式“下需要传输,不懂什么是”服务商模式“看下方文章
第一篇:
第二篇:
如果你不是“服务商模式”,这个字段注释掉就行了
3.1返回结果
四、查询订单交易状态
官方文档:
上面我们已经完成了“下单”操作,那现在我们要来完成“查询订单交易状态”的操作,在我们下单成功之后我们肯定要查询这个订单交易成功了没有对吧,要不然客户也不知道这个订单是支付成功了还是失败了。
1、将下方代码放入 com.maomao.pay.web.service.WeChatPayService中
2、调用“查询交易状态”接口
将下方代码放入com.maomao.pay.weChatPayTest,运行
2.1返回结果
{ "msg":"未支付", "code":0, "daata":{ "nonce_str":"w1EBrnqCnoZl0aWM", "trade_state":"NOTPAY", "sign":"3BC73DB4205FBA7F835FD534C921BC2F", "return_msg":"OK", "mch_id":"1603076382", "sub_mch_id":"1603126310", "sub_appid":"wx609af6beda27e69d", "device_info":"", "out_trade_no":"a1fa1f29a4e6402296eae4c8323c6120", "appid":"wxea266a95de9e87a9", "total_fee":"1", "trade_state_desc":"订单未支付", "result_code":"SUCCESS", "return_code":"SUCCESS" } }
五、前端整合调用支付
1、接口代码
2、前端代码
完成上面的代码,简单的一个支付实现就完成了。
六、异步回调通知
官方文档:
上诉代码,我们已经弄完了前端和后端的交互流程,前端页面也告诉了用户这笔订单的状态。但是。。。。。但是… ,我们后端不知道啊,我这么说你们肯定有疑问了,-那我们刚刚不是有一个“查询交易状态”的接口不是已经知道用户支付成功了吗?,为什么还要弄一个异步回调接口呢。你要是这么想的话,那你就肤浅了。。。。
1、什么是异步回调接口???
2、为什么我们要弄一个异步回调接口???
1、花生壳:(免费)
2、natapp:(免费),但是每次启动域名会变
1、回调接口服务层
将下方代码放入:com.maomao.pay.web.service.WeChatPayService
2、回调接口控制层
将下方代码放入:com.maomao.pay.web.controller.WeiXinPayController
returnWeChat实例值:
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>
3、预下单接口设置回调地址
在“预下单”接口控制层传入,回调地址(公网可以访问),也可以放入 yml文件中通过payProperties类进行注入(我这里就不演示了)
4、演示效果
走到这里就代表回调处理成功了,这样子你的真个流程就走完了。
在这里你需要做”验签“保证系统的安全性,防止不法分子仿造数据调用你的接口。记住处理你的项目业务逻辑的代码只能再这里进行,不要去“查询交易状态”接口中进行,要保证系统的安全性以及一致性,要不然用户支付成功了,你最后没给别人发货,那谁还敢用你的平台,其次当如果一个回调过来了,你要先查一下这个订单有没有支付过,如果是重复支付那你就要给用户进行退款处理。(退款的代码我就不放在这里演示了),我会放在项目源码里面。
七、源码下载
源码获取: