...
 
Commits (2)
    https://gitcode.net/int/IJPay/-/commit/396da1bf84241414eb27498a424f35d0fbd7ddc4 :sparkles: 微信支付支持教培续费通 2023-03-12T15:37:31+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/ed40ef498235aa1eb80d9a0e33feba8b567f2419 :sparkles: 新增微信支付商家转账到零钱示例 2023-03-12T15:38:24+08:00 Javen205 javendev@126.com
...@@ -26,11 +26,14 @@ import com.ijpay.wxpay.enums.v3.ComplaintsApiEnum; ...@@ -26,11 +26,14 @@ import com.ijpay.wxpay.enums.v3.ComplaintsApiEnum;
import com.ijpay.wxpay.enums.v3.OtherApiEnum; import com.ijpay.wxpay.enums.v3.OtherApiEnum;
import com.ijpay.wxpay.enums.v3.PayGiftActivityApiEnum; import com.ijpay.wxpay.enums.v3.PayGiftActivityApiEnum;
import com.ijpay.wxpay.enums.v3.PayScoreApiEnum; import com.ijpay.wxpay.enums.v3.PayScoreApiEnum;
import com.ijpay.wxpay.enums.v3.TransferApiEnum;
import com.ijpay.wxpay.model.v3.Amount; import com.ijpay.wxpay.model.v3.Amount;
import com.ijpay.wxpay.model.v3.BatchTransferModel;
import com.ijpay.wxpay.model.v3.Payer; import com.ijpay.wxpay.model.v3.Payer;
import com.ijpay.wxpay.model.v3.RefundAmount; import com.ijpay.wxpay.model.v3.RefundAmount;
import com.ijpay.wxpay.model.v3.RefundGoodsDetail; import com.ijpay.wxpay.model.v3.RefundGoodsDetail;
import com.ijpay.wxpay.model.v3.RefundModel; import com.ijpay.wxpay.model.v3.RefundModel;
import com.ijpay.wxpay.model.v3.TransferDetailInput;
import com.ijpay.wxpay.model.v3.UnifiedOrderModel; import com.ijpay.wxpay.model.v3.UnifiedOrderModel;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -51,6 +54,7 @@ import java.security.PrivateKey; ...@@ -51,6 +54,7 @@ import java.security.PrivateKey;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -328,6 +332,49 @@ public class WxPayV3Controller { ...@@ -328,6 +332,49 @@ public class WxPayV3Controller {
} }
} }
@RequestMapping("/batchTransfer")
@ResponseBody
public String batchTransfer(@RequestParam(value = "openId", required = false, defaultValue = "o-_-itxuXeGW3O1cxJ7FXNmq8Wf8") String openId) {
try {
BatchTransferModel batchTransferModel = new BatchTransferModel()
.setAppid(wxPayV3Bean.getAppId())
.setOut_batch_no(PayKit.generateStr())
.setBatch_name("IJPay 测试微信转账到零钱")
.setBatch_remark("IJPay 测试微信转账到零钱")
.setTotal_amount(1)
.setTotal_num(1)
.setTransfer_detail_list(Collections.singletonList(
new TransferDetailInput()
.setOut_detail_no(PayKit.generateStr())
.setTransfer_amount(1)
.setTransfer_remark("IJPay 测试微信转账到零钱")
.setOpenid(openId)));
log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
TransferApiEnum.TRANSFER_BATCHES.toString(),
wxPayV3Bean.getMchId(),
getSerialNumber(),
null,
wxPayV3Bean.getKeyPath(),
JSONUtil.toJsonStr(batchTransferModel)
);
log.info("发起商家转账响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Bean.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
if (response.getStatus() == OK && verifySignature) {
return response.getBody();
}
return JSONUtil.toJsonStr(response);
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
@RequestMapping("/put") @RequestMapping("/put")
@ResponseBody @ResponseBody
......
package com.ijpay.wxpay.enums.v3;
import com.ijpay.wxpay.enums.WxApiEnum;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>微信支付 v3 接口-教培续费通相关接口枚举</p>
*
* @author Javen
*/
public enum EduPaPayEnum implements WxApiEnum {
/**
* 通过协议号查询签约
*/
QUERY_CONTRACTS_BY_ID("/v3/edu-papay/contracts/id/%s", "通过协议号查询签约"),
/**
* 预签约
*/
PRE_SIGN("/v3/edu-papay/contracts/presign", "预签约"),
/**
* 解约
*/
DELETE_CONTRACTS("/v3/edu-papay/contracts/%s", "解约"),
/**
* 通过用户标识查询签约
*/
QUERY_CONTRACTS_BY_USER("/v3/edu-papay/user/%s/contracts", "通过用户标识查询签约"),
/**
* 受理扣款
*/
TRANSACTIONS("/v3/edu-papay/transactions", "受理扣款"),
/**
* 通过微信订单号查询订单
*/
QUERY_TRANSACTIONS_BY_TRANSACTION_ID("/v3/edu-papay/transactions/id/%s", "通过微信订单号查询订单"),
/**
* 通过商户订单号查询订单
*/
QUERY_TRANSACTIONS_BY_OUT_TRADE_NO("/v3/edu-papay/transactions/out-trade-no/%s", "通过商户订单号查询订单"),
/**
* 发送扣款预通知
*/
SEND_NOTIFICATION("/v3/edu-papay/user-notifications/%s/send", "发送扣款预通知"),
;
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
EduPaPayEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
@Override
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
@Override
public String getDesc() {
return desc;
}
}
package com.ijpay.wxpay.model.v3;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>发起商家转账 Model</p>
*
* @author Javen
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class BatchTransferModel {
/**
* 申请商户号的appid或商户号绑定的appid(企业号corpid即为此appid)
*/
private String appid;
/**
* 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一
*/
private String out_batch_no;
/**
* 该笔批量转账的名称
*/
private String batch_name;
/**
* 转账说明,UTF8编码,最多允许32个字符
*/
private String batch_remark;
/**
* 转账金额单位为“分”。转账总金额必须与批次内所有明细转账金额之和保持一致,否则无法发起转账操作
*/
private Integer total_amount;
/**
* 一个转账批次单最多发起一千笔转账。转账总笔数必须与批次内所有明细之和保持一致,否则无法发起转账操作
*/
private Integer total_num;
/**
* 发起批量转账的明细列表,最多一千笔
*/
private List<TransferDetailInput> transfer_detail_list;
/**
* 指定该笔转账使用的转账场景ID
*/
private String transfer_scene_id;
}
package com.ijpay.wxpay.model.v3;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>发起批量转账的明细列表</p>
*
* @author Javen
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class TransferDetailInput {
/**
* 商户系统内部区分转账批次单下不同转账明细单的唯一标识,要求此参数只能由数字、大小写字母组成
*/
private String out_detail_no;
/**
* 转账金额单位为“分”
*/
private Integer transfer_amount;
/**
* 单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符
*/
private String transfer_remark;
/**
* 商户appid下,某用户的openid
*/
private String openid;
/**
* 收款方真实姓名。支持标准RSA算法和国密算法,公钥由微信侧提供
* 明细转账金额<0.3元时,不允许填写收款用户姓名
* 明细转账金额 >= 2,000元时,该笔明细必须填写收款用户姓名
* 同一批次转账明细中的姓名字段传入规则需保持一致,也即全部填写、或全部不填写
* 若商户传入收款用户姓名,微信支付会校验用户openID与姓名是否一致,并提供电子回单
*/
private String user_name;
/**
* 收款方身份证号,可不用填(采用标准RSA算法,公钥由微信侧提供)
* 当填入收款方身份证号时,姓名字段必须填入。
*/
private String user_id_card;
}