pringboot整合微信支付sdk

Posted w53064

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pringboot整合微信支付sdk相关的知识,希望对你有一定的参考价值。

之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,要满足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));
//           
        

至此,提现接口完成。。

以上是关于pringboot整合微信支付sdk的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp微信支付配置怎么修改

phonegap(cordova) 自己定义插件代码篇----android ,iOS 微信支付工具整合

支付宝支付 微信支付SDK接口不统一? 盘他!

微信支付jssdk是做啥用的

微信支付开发 c# SDK JSAPI支付开发的流程和微信大坑

微信支付:curl出错,错误码:60