Java微信企业付款到微信钱包

1、APP付款到微信钱包 ,需要的条件

使用条件:

1、商户号已入驻90日且截止今日回推30天商户号保持连续不间断的交易。

2、登录微信支付商户平台-产品中心,开通付款到零钱。

微信官方链接:

【微信支付】付款开发者文档

接口调用请求说明

请求Url

https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

是否需要证书

是(证书及使用说明详见

商户证书

请求方式

POST

接口调用频率限制

100/s

超时时间(同笔订单最短重试时间)

1s

请求参数

字段名

变量名

必填

示例值

类型

描述

商户账号appid

mch_appid

wx8888888888888888

String(128)

申请商户号的appid或商户号绑定的appid

商户号

mchid

1900000109

String(32)

微信支付分配的商户号

设备号

device_info

013467007045764

String(32)

微信支付分配的终端设备号

随机字符串

nonce_str

5K8264ILTKCH16CQ2502SI8ZNMTM67VS

String(32)

随机字符串,不长于32位

签名

sign

C380BEC2BFD727A4B6845133519F3AD6

String(32)

签名,详见

签名算法

商户订单号

partner_trade_no

10000098201411111234567890

String(32)

商户订单号,需保持

唯一性

(只能是字母或者数字,不能包含有其它字符)

用户openid

openid

oxTWIuGaIt6gTKsQRLau2M0yL16E

String(64)

openid是微信用户在公众号appid下的唯一用户标识(appid不同,则获取到的openid就不同),可用于永久标记一个用户。

获取openid的链接

校验用户姓名选项

check_name

FORCE_CHECK

String(16)

NO_CHECK:不校验真实姓名

FORCE_CHECK:强校验真实姓名

收款用户姓名

re_user_name

王小王

String(64)

收款用户真实姓名。

如果check_name设置为FORCE_CHECK,则必填用户真实姓名

如需电子回单,需要传入收款用户姓名

金额

amount

10099

int

付款金额,单位为分

付款备注

desc

理赔

String(100)

付款备注,必填。

注意:备注中的敏感词会被转成字符*

Ip地址

spbill_create_ip

192.168.0.1

String(32)

该IP同在商户平台设置的IP白名单中的IP没有关联,该IP可传用户端或者服务端的IP。

付款场景

scene

BRAND_REDPACKET

String(64)

BRAND_REDPACKET:品牌红包,

其他值或不传则默认为普通付款到零钱

(品牌红包能力暂未全量开放,若有意愿参与内测请填写问卷

问卷系统

品牌ID

brand_id

1234

int

品牌在微信支付的唯一标识。仅在付款场景为品牌红包时必填。

消息模板ID

finder_template_id

1243100000000000

String(128)

品牌所配置的消息模板的唯一标识。仅在付款场景为品牌红包时必填。

请求示例:

<xml> 
<mch_appid>wxe062425f740c30d8</mch_appid>
<mchid>10000098</mchid>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str> <partner_trade_no>100000982014120919616</partner_trade_no> <openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>FORCE_CHECK</check_name>
<re_user_name>张三</re_user_name>
<amount>100</amount> 
<desc>节日快乐!</desc> 
<spbill_create_ip>10.2.3.10</spbill_create_ip> <sign>C97BDBACF37622775366F38B629F45E3</sign>
</xml>

返回参数

字段名

变量名

必填

示例值

类型

描述

返回状态码

return_code

SUCCESS

String(16)

SUCCESS/FAIL

此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断

返回信息

return_msg

签名失败

String(128)

返回信息,如非空,为错误原因

签名失败

参数格式校验错误

以下字段在return_code为SUCCESS的时候有返回

字段名

变量名

必填

示例值

类型

描述

商户appid

mch_appid

wx8888888888888888

String(128)

申请商户号的appid或商户号绑定的appid(号corpid即为此appId)

商户号

mchid

1900000109

String(32)

微信支付分配的商户号

设备号

device_info

013467007045764

String(32)

微信支付分配的终端设备号,

随机字符串

nonce_str

5K8264ILTKCH16CQ2502SI8ZNMTM67VS

String(32)

随机字符串,不长于32位

业务结果

result_code

SUCCESS

String(16)

SUCCESS/FAIL,注意:当状态为FAIL时,存在业务结果未明确的情况。如果状态为FAIL,请务必关注错误代码(err_code字段),通过查询接口确认此次付款的结果。

错误代码

err_code

SYSTEMERROR

String(32)

错误码信息,注意:出现未明确的错误码时(SYSTEMERROR等),请务必用

原商户订单号重试

,或通过查询接口确认此次付款的结果。

错误代码描述

err_code_des

系统错误

String(128)

结果信息描述

以下字段在return_code 和result_code都为SUCCESS的时候有返回

字段名

变量名

必填

示例值

类型

描述

商户订单号

partner_trade_no

1217752501201407033233368018

String(32)

商户订单号,需保持历史全局

唯一性

(只能是字母或者数字,不能包含有其它字符)

微信付款单号

payment_no

1007752501201407033233368018

String(64)

付款成功,返回的微信付款单号

付款成功时间

payment_time

2015-05-19 15:26:59

String(32)

付款成功时间

成功示例:

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[]]></return_msg>
<mch_appid><![CDATA[wxec38b8ff840bd989]]></mch_appid>
<mchid><![CDATA[10013274]]></mchid>
<device_info><![CDATA[]]></device_info>
<nonce_str><![CDATA[lxuDzMnRjpcXzxLx0q]]></nonce_str>
<result_code><![CDATA[SUCCESS]]></result_code>
<partner_trade_no><![CDATA[10013574201505191526582441]]></partner_trade_no>
<payment_no><![CDATA[1000018301201505190181489473]]></payment_no>
<payment_time><![CDATA[2015-05-19 15:26:59]]></payment_time>
</xml>

错误示例:

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[SYSTEMERROR]]></err_code>
<err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des>
</xml>

错误码

错误代码

描述

原因

解决方案

NO_AUTH

没有该接口权限

1. 用户账号被冻结,无法付款

2. 产品权限没有开通或者被风控冻结

3. 此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置

请根据具体的错误返回描述做对应处理,如返回描述不够明确,请参考此处的错误原因做排查。

AMOUNT_LIMIT

金额超限

1. 被微信风控拦截,最低单笔付款限额调整为5元。

2. 低于最低单笔付款限额或者高于最高单笔付款限额

目前最低付款金额为1元,最高10万元,请确认是否付款金额超限。

PARAM_ERROR

参数错误

1. 请求参数校验错误

2. 字符中包含非utf8字符

3. 商户号和appid没有绑定关系

请参照原因检查您的请求参数是否正确。

OPENID_ERROR

Openid错误

Openid格式错误或者不属于商家公众账号

Openid与appid是有一一映射关系的,请确保正确使用。

SEND_FAILED

付款错误

付款错误,请查单确认付款结果

请查单确认付款结果,以查单结果为准。

NOTENOUGH

余额不足

您的付款账号余额不足或资金未到账

如果要继续付款必须使用原商户订单号重试。

SYSTEMERROR

系统繁忙,请稍后再试。

微信内部接口调用发生错误

请先调用查询接口,查看此次付款结果,如结果为不明确状态(如订单号不存在),请务必使用原商户订单号进行重试。

NAME_MISMATCH

姓名校验出错

收款人身份校验不通过

如果要继续付款必须使用原商户订单号重试。

SIGN_ERROR

签名错误

校验签名错误

请检查您的请求参数和签名密钥KEY是否正确,如果要继续付款必须使用原商户订单号重试。

XML_ERROR

Post内容出错

Post请求数据不是合法的xml格式内容

格式问题,请检查请求格式是否正确。

FATAL_ERROR

两次请求参数不一致

两次请求商户单号一样,但是参数不一致

重入必须保证所有参数值都不变。

FREQ_LIMIT

超过频率限制,请稍后再试。

接口请求频率超时接口限制

调用接口过于频繁,请稍后再试,如果要继续付款必须使用原商户订单号重试。

MONEY_LIMIT

已经达到今日付款总额上限/已达到付款给此用户额度上限

请关注接口的付款限额条件

付款额度已经超限,请参考接口使用条件,如果要继续付款必须使用原商户订单号重试。

CA_ERROR

商户API证书校验出错

请求没带商户API证书或者带上了错误的商户API证书

您使用的调用证书有误,请确认是否使用了正确的证书,可以前往商户平台重新下载,证书需与商户号对应,如果要继续付款必须使用

原商户订单号重试

V2_ACCOUNT_SIMPLE_BAN

无法给未实名用户付款

用户微信支付账户未实名,无法付款

不支持给未实名用户付款,如果要继续付款必须使用原商户订单号重试。

PARAM_IS_NOT_UTF8

请求参数中包含非utf8编码字符

接口规范要求所有请求参数都必须为utf8编码

微信接口使用编码是UTF-8,请确认,如果要继续付款必须使用原商户订单号重试。

SENDNUM_LIMIT

该用户今日付款次数超过限制,如有需要请进入【微信支付商户平台-产品中心-付款到零钱-产品设置】进行修改

该用户今日付款次数超过限制,如有需要请进入【微信支付商户平台-产品中心-付款到零钱-产品设置】进行修改

向用户付款的次数超限了,请参考接口使用条件,如果要继续付款必须使用原商户订单号重试。

RECV_ACCOUNT_NOT_ALLOWED

收款账户不在收款账户列表

收款账户不在收款账户列表

请登陆商户平台,查看产品中心付款到零钱的产品配置

PAY_CHANNEL_NOT_ALLOWED

本商户号未配置API发起能力 

本商户号未配置API发起能力 

请登陆商户平台,查看产品中心付款到零钱的产品配置

SEND_MONEY_LIMIT

已达到今日商户付款额度上限

请提高商户付款额度,或明日再试

如果要继续付款必须使用

原商户订单号重试

RECEIVED_MONEY_LIMIT

已达到今日付款给此用户额度上限

请提高用户收款额度,或明日再试

如果要继续付款必须使用

原商户订单号重试

PARAM_ERROR

付款商户号无法使用该品牌信息

付款商户号不是该品牌的品牌主商户号或门店收款商户号

使用品牌的品牌主商户号或门店收款商户号进行付款

NO_AUTH

付款商户号无品牌红包产品权限

付款商户号没有品牌红包产品权限

付款商户号开通品牌红包产品权限后再进行付款

PARAM_ERROR

品牌信息查询失败,请确认品牌状态有效

品牌已被注销或状态无效

确认品牌信息有效后重试

PARAM_ERROR

品牌和视频号没有绑定关系

品牌和视频号没有绑定或已解绑

确认品牌和视频号仍然是绑定状态后重试

PARAM_ERROR

品牌下未查到对应品牌红包消息模板

品牌和品牌红包消息模板没有对应关系

确认品牌和消息模版的对应关系后重试

PARAM_ERROR

品牌红包消息模板已被删除

品牌红包消息模板已被删除

传入未被删除的消息模版

EXCEED_PAYEE_ACCOUNT_LIMIT

用户账户收款受限

收款用户身份信息待完善

请联系用户完善其在微信支付的身份信息以继续收款

这里使用的是Binary Wang 所写的开源项目  weixin-java-pay

1、导入maven文件(最好放在最外面的那个pom.xml文件)

<!--微信支付-->
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>wx-java-pay-spring-boot-starter</artifactId>
    <version>4.1.0</version>
</dependency>

2、WxPayConfiguration配置

将 com.github.binarywang.wxpay.service.WxPayService 作为Bean注入到项目中

application.yml配置

wx:
  pay:
    appId: xxxxxx#微信公众号或者小程序等的appid
    mchId: xxxxxxxx#微信支付商户号
    mchKey: xxxxxxxxxxxx#微信支付商户密钥
    subAppId: #服务商模式下的子商户公众账号ID
    subMchId: #服务商模式下的子商户号
    keyPath: classpath:/apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)

证书位置:

WxPayConfiguration



/**
 * @author Binary Wang
 */
@Configuration
@ConditionalOnClass(WxPayService.class)
@EnableConfigurationProperties(WxPayProperties.class)
@AllArgsConstructor
@Slf4j
public class WxPayConfiguration {
    private WxPayProperties properties;

    @SneakyThrows
    @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;
    }
}

WxPayProperties

package com.mdframework.framework.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * wxpay pay properties.
 *
 * @author Binary Wang
 */
@Data
@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;

}

3、API调用


// 企业赚钱到用户微信钱包
EntPayRequest entPayRequest = new EntPayRequest();
entPayRequest.setAppid(properties.getAppId());
entPayRequest.setMchId(properties.getMchId());
entPayRequest.setPartnerTradeNo(memberBalanceCashout.getCashoutNo());
entPayRequest.setOpenid(memberInfo.getOpenId());
entPayRequest.setCheckName("NO_CHECK");
entPayRequest.setAmount(memberBalanceCashoutVo.getCash().multiply(BigDecimal.valueOf(100)).intValue());
entPayRequest.setDescription("提现到微信钱包");
entPayRequest.setSpbillCreateIp(PayUtil.getIp());
try {
    EntPayResult entPayResult = wxPayService.getEntPayService().entPay(entPayRequest);
    log.info("entPayResult : " + entPayResult);
    //业务逻辑
    ........
} catch (WxPayException e) {
    log.error("付款失败,返回报文" + e);
    throw new RuntimeException("付款失败,返回报文" + e);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值