前言 之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,要满足3个条件; 之前实现
前言
之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,要满足3个条件;
之前实现过几个微信支付的接口,不过都是自己码的代码,从网上找找拼凑,觉得看起来不舒服~_~ 于是乎找到了微信官方提供的支付sdk。这里用的是java版本,springboot整合java
下载sdk,引入项目
这里可以直接下载官方提供的sdk,然后将几个java类拷贝到你的项目,也可以直接引入maven依赖,这里是直接将Java类拷贝到我项目的。
<!-- https://mvnrepository.com/artifact/com.github.wxpay/WXPay-SDK-Java --> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>WXPay-SDK-Java</artifactId> <version>0.0.4</version> </dependency>
如图,打开sdk项目,会有以下几个文件
配置config文件
通过它的readme文件,可以看到几个demo。但是首先我们需要配置相关的信息。新建一个java类继承原先的配置类。
package com.github.wxpay.sdk; import java.io.InputStream; /** * @author Ean * @date 2019/7/2 */ public class MyConfig extends WXPayConfig { /** * 获取 App ID * * @return App ID */ @Override String getAppID() { return "wxdb70c7c6b******"; } /** * 获取 Mch ID * * @return Mch ID */ @Override String getMchID() { return "1522050000"; } /** * 获取 API 密钥 * * @return API密钥 */ @Override String getKey() { return "xxxxxxxxxxxxxxxx"; } /** * 获取商户证书内容 * 这里是读取resources根目录下面的证书文件 * @return 商户证书内容 */ @Override InputStream getCertStream() { InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("apiclient_cert.p12"); return certStream; } /** * 获取WXPayDomain, 用于多域名容灾自动切换 * 实现这个接口 * @return */ @Override public IWXPayDomain getWXPayDomain() { IWXPayDomain iwxPayDomain = new IWXPayDomain() { public void report(String domain, long elapsedTimeMillis, Exception ex) { } public DomainInfo getDomain(WXPayConfig config) { return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true); } }; return iwxPayDomain; } }
提现接口开发
写一个提现接口,传入提现相关的参数
/** *@描述 提现接口 *@参数 [param] *@创建人 Eangaie *@创建时间 2019/7/2 */ @PostMapping("despot") public Result despot(@RequestBody Map<String,Object> param) throws Exception { MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config,1); SortedMap<String, String> sendData; sendData=getDespData(param); sendData.put("sign", WXPayUtil.generateSignature(sendData,key , WXPayConstants.SignType.MD5)); Map<String,String> resData=wxpay.despot(sendData,config.getHttpConnectTimeoutMs(),config.getHttpReadTimeoutMs()); return ResultUtil.success(resData); } private SortedMap<String, String> getDespData(Map<String, Object> param) { SortedMap<String, String> params = new TreeMap<String, String>(); String nonce_str=commonUtil.gen32RandomString(); String partner_trade_no=commonUtil.createNo(); String openid= String.valueOf(param.get("openid")); String check_name="NO_CHECK"; String amount= String.valueOf(param.get("amount")); String desc="用户提现"; String spbill_create_ip= String.valueOf(param.get("spbill_create_ip")); params.put("mch_appid",mch_appid); params.put("mchid",mchid); params.put("nonce_str",nonce_str); params.put("partner_trade_no",partner_trade_no); params.put("openid",openid); params.put("check_name",check_name); params.put("amount", amount); params.put("desc", desc); params.put("spbill_create_ip", spbill_create_ip); return params; }
这里的一些变量,比如商户id,appid这些直接通过spring扫描application配置文件自动注入,接口参数主要是传过来openid,跟提现金额。其实这个spbill_create_ip字段也可以固定的。
一开始是因为开发一直遇到IP不允许访问的问题,最后发现。。是商户号配置锅,商户号记得把配置允许IP访问这个地方关了!,不然就一直不能访问接口
提现成功返回,但是程序也会报500,因为processResponseXml这个函数里面有校验返回值。但是提现这里用不到,可以注释掉代码。
else if (return_code.equals(WXPayConstants.SUCCESS)) { return respData; // if (this.isResponseSignatureValid(respData)) { // return respData; // } // else { // throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr)); // } }
至此,提现接口完成。。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。