一、写作初衷
最近写微信支付的时候发现微信的官方文档寻找案例不是特别方便,而且网上找了很久没有发现比较简单易懂的过程讲解和示例代码,因此想写一篇文章,一方面为了巩固自己的知识,另一方面也是为大家提供一个参考的代码,让想学习或者工作中需要写支付的人提供一个方便,如果内容有错误或者优化的思路,请大神指点。
二、准备工作
一、了解微信支付
通过查看官方文档我们发现,微信支付分为五种类型,分别是:JS支付,app支付,h5支付以及小程序支付和Native支付,这里我们拿app支付举例,因为所有的微信支付其实都是换汤不换药,学会了一个之后后面的也就自然的学会了。
二、接入前准备
我们知道个人是没有办法进行接口的调用的,必须要有企业去申请微信支付的资料,如果有想学习的可以了解一下支付的思路,为以后做准备。
接下来介绍一下支付需要写的接口以及过程,观看文档看到,主要的接口其实分为四个,支付,查询支付订单,退款已经查询退款订单,我们今天主要写支付的接口,在这里我推荐使用微信支付的官方SDK来进行操作,因为支付的时候涉及到一个验签的操作,使用官方的SDK在支付时官方进行了这个操作,不需要我们进行额外操作,关于验签,简单来说就是我们在和微信交互的过程中需要验证是我们或者是微信官方发来的信息,需要对信息的完全性和正确性做一个判断,保障安全,如果不进行这一步会造成中途有人篡改了信息后,我们以为支付成功,但是微信那边其实支付失败的问题,造成损失,这里暂时不需要过多了解,如果这篇文章被人看到,想要了解,后续会继续坚持写下去。
微信官方SDK:
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.12</version>
</dependency>
了解完前置需求,我们来说一下支付接口,支付接口主要是分为两个接口,分别是App下单接口和App调起支付接口,观察后发现,App下单接口主要是为了拿到prepay_id,也就是预支付交易会话标识,拿到之后再去访问App调起支付接口,拿到支付完成的信息,观察SDK源码发现,源码中有一个类AppServiceExtension,里面有一个支付的方法,是prepayWithRequestPayment,关于这个方法,官方的介绍是:(APP 支付下单,并返回 APP 调起支付数据。推荐使用!请求成功后,该方法返回预支付交易会话标识 prepay_id 和客户端 APP 调起支付所需参数。 它相比 AppService.prepay更简单易用,因为无需开发者自行计算调起支付签名。)因此我们选择这个方法来实现支付。这个时候我们就可以忽略App调起支付的接口,因为微信官方已经完成了这个步骤。
三、代码实现
先看一下service层的代码实现,然后具体讲解
Config config = new RSAAutoCertificateConfig.Builder()
.merchantId("你的mch_id")
.apiV3Key("你的apiv3秘钥")
.merchantSerialNumber("你的商户证书序列号")
.privateKeyFromPath("你的证书地址")
.build();
PrepayRequest request = new PrepayRequest();
request.setAppid("你的app_id");
request.setMchid("你的mch_id");
request.setDescription("商品的描述");
request.setOutTradeNo("订单号");
Amount amount = new Amount();
amount.setTotal("订单价格");
request.setAmount(amount);
request.setNotifyUrl("回调地址");
log.info("微信发起支付,请求参数:{}",request);
AppServiceExtension service = new AppServiceExtension.Builder().config(config).build();
PrepayWithRequestPaymentResponse prepay = service.prepayWithRequestPayment(request);
log.info("微信发起支付,返回参数:{}",prepay);
以上就是一个简单的支付的业务代码,因为我们使用了官方SDK的缘故,所以代码比较简洁,最主要的就是调用接口,塞入参数而已。拿到prepay,这个里面有所有的支付完成的信息,拿到这个字段后按照自己的业务来进行一个封装,这样后端的业务代码就完成了。然后就是等待前端调我们的接口,前端完成后就可以进行支付,支付完成后,微信那边会进行一个回调,告诉我们这笔订单已经支付完成,然后才算完全支付完成。
回调的代码后续会逐步完善,关于加密解密,回调验签这些重要的知识后续可能也会整理出来,巩固知识的同时也给大家多一份参考。
四、总结
第一次写文章,可能会有很多不熟悉的地方,后续也会逐步完善,当时找了很久,都没有找到一些比较方便容易的业务代码,所以想着自己写一下,如果有人可以参考是最好的,后面也会根据自己情况去完善支付别的代码,因为支付最重要的其实不是这些代码,这些只是完成了功能,后面还会写一些更加复杂的逻辑和代码。