微信小程序开发笔记 支付篇⑤——基于WxJava实现微信支付SpringBoot后端接口的使用

一、前言

微信小程序开发笔记——导读

WxJava - 微信开发 Java SDK(开发工具包)
weixin-java-pay-demo - 基于 WxJava 和 Spring Boot 构建,演示微信支付后端接口使用方法。

二、依赖

pom.xml

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-pay</artifactId>
            <version>4.1.0</version>
        </dependency>

三、属性

3.1 application.yml

  • 如果没有子商户的话,subAppIdsubMchId可以直接注释掉
  • API证书apiclient_cert.p12直接放在application.yml同目录下
# 微信支付
wx:
  pay:
    appId: #微信公众号或者小程序等的appid
    mchId: #微信支付商户号
    mchKey: #微信支付商户密钥
#    subAppId: #服务商模式下的子商户公众账号ID
#    subMchId: #服务商模式下的子商户号
    keyPath: classpath:apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)

3.2 WxPayProperties

WxPayProperties


@Component
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayProperties
{
    /**
     * 设置微信公众号或者小程序等的appid
     */
    private String appId;

    /**
     * 微信支付商户号
     */
    private String mchId;

    /**
     * 微信支付商户密钥
     */
    private String mchKey;

    /**
     * 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
     */
    private String subAppId;

    /**
     * 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
     */
    private String subMchId;

    /**
     * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
     */
    private String keyPath;

    public String getAppId() {
        return appId;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }

    public String getMchKey() {
        return mchKey;
    }

    public void setMchKey(String mchKey) {
        this.mchKey = mchKey;
    }

    public String getSubAppId() {
        return subAppId;
    }

    public void setSubAppId(String subAppId) {
        this.subAppId = subAppId;
    }

    public String getSubMchId() {
        return subMchId;
    }

    public void setSubMchId(String subMchId) {
        this.subMchId = subMchId;
    }

    public String getKeyPath() {
        return keyPath;
    }

    public void setKeyPath(String keyPath) {
        this.keyPath = keyPath;
    }

    @Override
    public String toString() {
        return "WxPayProperties{" +
                "appId='" + appId + '\'' +
                ", mchId='" + mchId + '\'' +
                ", mchKey='" + mchKey + '\'' +
                ", subAppId='" + subAppId + '\'' +
                ", subMchId='" + subMchId + '\'' +
                ", keyPath='" + keyPath + '\'' +
                '}';
    }
}

四、配置Config

MyWxPayConfig


@Configuration
@ConditionalOnClass(WxPayService.class)
public class MyWxPayConfig {

    @Autowired
    private WxPayProperties properties;

    @Bean
    @ConditionalOnMissingBean
    public WxPayService wxService() {
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
        payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
        payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));

        // 可以指定是否使用沙箱环境
        payConfig.setUseSandboxEnv(false);

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        return wxPayService;
    }
}

五、应用Controller

LocalTestController

    @Autowired
    private WxPayService wxService;
 
 
    @ApiOperation("统一下单")
    @Log(title = "统一下单", businessType = BusinessType.UPDATE)
    @PostMapping("/unifiedOrder")
    public AjaxResult unifiedOrder(String outTradeNo) throws Exception
    {
        WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
        wxPayUnifiedOrderRequest.setBody("测试");
        wxPayUnifiedOrderRequest.setOutTradeNo(outTradeNo);
        wxPayUnifiedOrderRequest.setTotalFee(520200);
        wxPayUnifiedOrderRequest.setSpbillCreateIp("127.0.0.1");
        wxPayUnifiedOrderRequest.setNotifyUrl("payCallBack");
        wxPayUnifiedOrderRequest.setTradeType("JSAPI");
        wxPayUnifiedOrderRequest.setOpenid("oU5Ta5f9Vx6f-***********");

        return AjaxResult.success(wxService.unifiedOrder(wxPayUnifiedOrderRequest));
    }

    @ApiOperation("查询订单")
    @Log(title = "查询订单", businessType = BusinessType.UPDATE)
    @PostMapping("/queryOrder")
    public AjaxResult queryOrder(String outTradeNo) throws Exception
    {
        WxPayOrderQueryResult wxPayOrderQueryResult = wxService.queryOrder(null, outTradeNo);
        logger.info(wxPayOrderQueryResult.toString());
        return AjaxResult.success(wxPayOrderQueryResult);
    }

六、PostMan调试

6.1 统一下单

在这里插入图片描述

20:40:45.259 [http-nio-8080-exec-1] INFO  c.g.b.w.s.i.WxPayServiceImpl - [post,73] - 
【请求地址】:https://api.mch.weixin.qq.com/pay/unifiedorder
【请求数据】:<xml>
  <appid>wx4e4c9427ec042a8a</appid>
  <mch_id>1547230971</mch_id>
  <nonce_str>1626784844711</nonce_str>
  <sign>199A4CFC84CBAC9AF5E633C73A6FD960</sign>
  <body>测试</body>
  <out_trade_no>8916a2eeedc15c7f140</out_trade_no>
  <total_fee>520200</total_fee>
  <spbill_create_ip>127.0.0.1</spbill_create_ip>
  <notify_url>payCallBack</notify_url>
  <trade_type>JSAPI</trade_type>
  <openid>oU5Ta5f9Vx6f-Q6doktEd4Z_aqHM</openid>
</xml>
【响应数据】:<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<mch_id><![CDATA[1547230971]]></mch_id>
<appid><![CDATA[wx4e4c9427ec042a8a]]></appid>
<nonce_str><![CDATA[reL0fAT85nDlb7KV]]></nonce_str>
<sign><![CDATA[FB536447C788BEFADB4D8C487A187347]]></sign>
<prepay_id><![CDATA[wx20204045412219a6748aed26d324770000]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

6.1 查询订单(正常)

在这里插入图片描述

20:50:33.319 [http-nio-8080-exec-2] INFO  c.g.b.w.s.i.WxPayServiceImpl - [post,73] - 
【请求地址】:https://api.mch.weixin.qq.com/pay/orderquery
【请求数据】:<xml>
  <appid>wx4e4c9427ec042a8a</appid>
  <mch_id>1547230971</mch_id>
  <nonce_str>1626785433013</nonce_str>
  <sign>07BD88F4BD66E6CF0A63977DB5967097</sign>
  <out_trade_no>8916a2eeedc15c7f138</out_trade_no>
</xml>
【响应数据】:<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<mch_id><![CDATA[1547230971]]></mch_id>
<appid><![CDATA[wx4e4c9427ec042a8a]]></appid>
<device_info><![CDATA[]]></device_info>
<trade_state><![CDATA[NOTPAY]]></trade_state>
<total_fee>520200</total_fee>
<out_trade_no><![CDATA[8916a2eeedc15c7f138]]></out_trade_no>
<trade_state_desc><![CDATA[订单未支付]]></trade_state_desc>
<nonce_str><![CDATA[OQcSkSb0wibGZ0I1]]></nonce_str>
<sign><![CDATA[37EED915AA5DF3C9465686D3B940F358]]></sign>
</xml>

6.1 查询订单(异常)

程序抛出异常,订单不存在
在这里插入图片描述

七、其他

微信支付—开发文档

签名错误讨论区-V2版

微信支付接口签名校验工具

觉得好,就一键三连呗(点赞+收藏+关注)

  • 15
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要追加额外费用) 微信小程序是腾讯公司基于微信平台推出的一种轻量级应用形态,它无需用户下载安装即可在微信内直接使用。自2017年正式上线以来,小程序凭借其便捷性、易获取性和出色的用户体验迅速获得市场认可,并成为连接线上线下服务的重要桥梁。 小程序的核心特点包括: 零安装:用户只需通过微信扫一扫或搜索功能,即可打开和使用小程序,大大降低了用户的使用门槛和手机存储空间压力。 速度快:加载速度相较于传统的HTML5网页更快,依托于微信强大的基础设施,能够实现近乎原生应用的流畅体验。 跨平台兼容:开发者一次开发,即可在多种终端设备上运行,免除了复杂的适配工作,大大提高了开发效率。 社交属性强:小程序可以无缝嵌入微信生态,支持分享至聊天窗口、朋友圈等社交场景,有利于用户间的传播和裂变增长。 丰富接口能力:提供丰富的API接口,可调用微信支付、位置服务、用户身份识别等多种功能,方便企业进行商业服务的集成与拓展。 目前,微信小程序已经覆盖了电商购物、生活服务、娱乐休闲、教育学习、工具助手等多个领域,为数以亿计的用户提供便捷的服务入口,也为众多商家和开发者提供了新的商业模式和创业机会。随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值