阅读 297

JavaWeb项目对接微信扫码支付

原文链接: www.jianshu.com

项目地址:wxpay github repo

当我接到对接微信支付的开发任务时,我的第一反应是查看官方文档,但是官方文档并不是十分简洁易读(可能是我能力有限),且可能由于开发者习惯不同或业务场景不同,造成了不同接口的对接形式,文档说明有不小的差异。所以我决定在github以及各大博客站搜索有用资源,遗憾的是,耗费了些许时间后并没有找到可靠的内容~于是只有回过头来继续钻研文档,并不断调试,官方文档与官方所提供的java demo代码也有些许偏差,不同接口的命名、对接形式不同,没有统一的规范,都无疑加长了完成此项任务的工作时间。在完成了开发任务后,决定整理此篇文章,为有同样需求的开发者提供一个可靠便利的对接说明,并封装了工具包。

我能协助你完成什么?

  • 如果你有一个java项目想要对接微信的扫码支付功能,请留步~
  • 需要先说一下的是,微信支付接口仅对企业公众号开放,个人用户请绕行~
  • 微信支付官方开发文档及JavaDemo下载地址(请先不要打开它~继续看我的描述):pay.weixin.qq.com/wiki/doc/ap…
  • 上面链接里的官方文档及Java版Demo很感人,如果你认为自己逻辑思维能力很强并且有时间钻研,可以去了解,但还是建议你先看完这篇介绍再做决定
  • 为了让你更快的实现开发功能,完成相关开发进度,本项目对 “JavaWeb项目对接微信扫码支付 ” 应用场景相关功能进行了简单封装实现
  • 代码结构简单清晰易用,几个.java文件加上篇说明快速帮你理清头绪
  • 当然了,本项目关注点在于开发,对于微信公众号申请、公众号申请对接支付接口等事情留给产品or商务小姐姐

代码里有啥功能?

  • 针对“java对接微信扫码支付”场景,本项目包含功能入下:
    • 统一下单接口
    • 查询订单接口
    • 关闭订单接口
    • 退款申请接口
    • 退款查询接口
    • 统一下单回调Servlet简单实现
    • 退款申请回调Servlet简单实现
  • 业务流程:
    • 调用[统一下单接口]获得同步返回数据中的二维码连接
    • 调用第三方库将二维码连接转换二维码,展示二维码(这可能需要页面实现,本文仅关注后台接口实现)
    • 扫码支付
    • 微信系统回调[统一下单回调Servlet]设定的url地址,通知你进度信息
      • 回调url在统一下单接口请求的参数中设定
    • 当然,扫码支付前,你可以调用[关闭订单接口]将订单提前终止
    • 也可以随时调用[查询订单接口]看看订单信息
    • 付款成功后,可以调用[退款申请接口]申请退款,同步返回数据中会告诉你是否成功,成功的话,说明微信系统成功接到了你的申请,但此时,实际状态为“退款中”
    • 当退款有进度更新时,微信系统回调[退款申请回调Servlet]设定的url地址,通知你进度信息
      • 回到url在微信商户平台设定:交易中心-->交易管理-->退款配置-->通知URL
    • 当然,你可以通过调用[退款查询接口]自行查看退款情况

如果需要开发,你需要准备什么

  • Clone本项目, github.com/zerolee1993… 理解一下代码,相信我这并不难

    • Const.java 常量类,定义了一些参数,当然可以根据你自己的系统,将这些参数放到数据库中,并舍弃这个类
    • WXPayConfigImpl.java 配置实现类,针对官方提供配置接口进行实现,如果你将Const.java中的参数放到了数据库中,你需要调整这个类,当前为单例模式实现,否则可能导致更改数据库参数配置不会生效的问题。
    • WXPaySender.java 请求接口封装类,通过这个类的实例,可调用功能中的所有接口,不包含回调sevlet
    • WXPayTradeReciver.java 统一下单回调Servlet的简单实现
    • WXPayRefundReciver.java 退款申请回到Servlet的简单实现
    • Servlet的简单实现仅仅是对收到的数据做了打印,这时有人会想,既然功能相同为什么要写两个servlet,原因如下
      • 统一下单的回调,地址是在统一下单请求时参数中指定,返回信息不加密
      • 退款申请的回调,地址是在商户平台中配置,返回信息需要解密
  • 你需要商务人员提供如下信息(作为接口调用的参数),如果你是商务兼开发,非常nice,括号里给出了稍微详细的获得方式

    • 微信支付商户号(登录微信商户平台-->账户中心-->商户信息-->基本账户信息-->微信支付商户号)
    • 公众号APPID(在微信公众平台中,应该不难找~)
    • API秘钥(登录微信商户平台-->账户中心-->API安全-->API密钥-->设置API密钥)
    • 证书文件(登录微信商户平台-->账户中心-->API安全-->API证书-->下载证书,包中有一个.p12文件,那就是你需要的)

开始开发

  • 为了便于调试更改,将代码直接copy到你的项目中某包下即可,项目引用了微信支付SDK的jar包,如果你不是maven项目,webapp/lib下给你准备了jar包,你也可以自己下载
  • 打开Const.java,根据上一步你获得的信息,配置调用常量,值得注意的是
  • 参照src/test/java/TestSender.java发起统一下单、关闭订单等功能
    • 实例中没有封装使用沙箱环境发起交易,而使用的真实交易
    • 原因为微信官方文档中没有任何沙箱环境的使用说明,Java的demo中若隐若现有相关操作,但沙箱环境各种不正常报错让人崩溃,无力吐槽~
    • 不要担心,真实交易设置每次一分钱,且可以退款~
  • 类似的可以自己调用其他接口,只需要一个WXPaySender实例即可
  • 具体接口的输入输出参数说明,可以参考WXPaySender类中的注释~~~

遇到问题

  • 由于本人技术有限,代码或文档有不足之处敬请提出建议~
  • 使用中有任何问题,可以与我联系 @可乐味的白衬衫