不久前,刚做了微信扫码支付(NATIVE),官方的API已经写的很清楚,但是坑是真不少,整个开发下来,虽不至于崩溃,但是真的很浪费时间。我们接入的是扫码支付,这里做个记录,希望能够对自己或者对别人有帮助。
这里先贴一下官网文档:微信支付API文档。里边既有API的使用方法,也有官方提供的Demo,大家可以去下载看一看。
在开发过程中测试的时候需要用到内外网穿透工具,这里我使用的是花生壳。
接下来是准备工作,在开发之前,我们需要准备开发所要的参数,其实用的只有appid(微信支付分配的公众账号ID),mch_id(微信支付分配的商户号),key(私钥)。如果大家可能是第一次开发,不知道这些参数怎么搞,来这里看看,希望对你有帮助:账号关联(AppID绑定)。至于key是在用户登录微信商户平台之后,选择账户中心 -——>API安全之中通过引导来来设置;包括上边的证书,这个东西也是必备的,在微信退款的时候我们就必须用到这里的证书。乱七八糟的,还是挺麻烦的......
下边我们去看看扫码支付的流程,官方提供了俩种模式,我这里使用的是模式二,先贴一个官方的流程图:
整个流程看下来其实就是用户通过订单信息和微信提供的统一下单API的接口直接进行http请求,然后微信会生成一个预支付交易,之后后返回一个url,将这里的url埋入二维码就可以了。到这里二维码就生成了,各位就可以消费了,消费之后微信会调支付回调接口,通知支付结果。这里提到的支付接口和回调接口需要在微信商户平台进行配置。下边就直接上代码了。
先看看支付接口:
微信中支付金额的单位是分(光看数字很大啊,记得*100)。
下边是怎么去生成签名,生成签名要注意的地方还是挺多的,最起码得保证appid,mch_id,key要正确。先看看官方怎么说的:
下边是代码:
获取到签名之后,拿着这些参数去发起Post请求获取预支付订单,这些工具类网上很多,直接拿来用:
微信里边操作的xml格式的数据,java中习惯操作的是对象,再去封装xml和Object之间转换的工具类:
通过官方提供返回的xml返回参数,创建实体类:
通过返回的return_code和result_code判断预支付订单的生成结果,如果成功了就该生成二维码了:
然后保存二维码,放到页面就可以啦!
下边是支付回调,判断支付是否成功:
这里有坑!回调的时候微信给我的返回值的参数不能按照官网中的模板来创建接收毁掉结果的实体类。他的模板是错误的,大家按我验签时候用到的参数去创建实体类,可以节省不少时间,验签这个方法generateSignature是微信提供的demo中有,我们可以去下载下来看看。
回调其实就是微信通过你支付时提供的回调url,主动调用并给你返回结果,返回要验签,不然容易被修改信息。验签之后判断支付结果去修改业务中的状态。官方是这么说的:
大家要注意啊!
下边再说一下退款,退款需要证书的,这个上边提到过,去微信商户平台生成下载,微信是通过微信订单号(transaction_id)来退款的,transaction_id这个参数是支付回调时候返回的,注意保存。其他的感觉没什么难度,我就简单的贴一下代码:
下边就是回调了,它是返回了一个加密的字符串,我们需要进行解密,官方提供了解密的步骤:
到这里微信支付就分享完了,希望对各位有所帮助,有什么错误也希望大家指正,共同学习,共同进步!