一、简介

  微信作为现在人民的使用,并且微信成为众多商家做活动的首选项,基于微信以前企业微信付款到零钱改为了企业微信商家转账到零钱。因为开发需求,亲自实现了企业微信商家转账到零钱的功能。

二、微信企业商家转账到零钱开通

开通条件:
1,商户号需入驻90天;
2,需要有连续30天的交易流水(截止今日回推30天)

流程:
找到产品中心,点击开通商家转账到零钱功能。

额度限制:
   跟以前微信企业支付到零钱一样,目前商户号企业转账功能开通后,初始额度统一为单用户单日单笔200元,单日总额度10W元,如果是初始商家账户,一个用户每日只能转账10次。

默认情况下,企业付款到零钱使用商户号基本户(或余额账户)余额。如商户号已开通运营账户,则企业付款到零钱使用运营账户内的资金。

三、实现商家转账到零钱(该功能需要跟微信公众号一起)

   微信公众号和商户号需要关联,可以在公众号查看是否关联。如图:

四、商户号实现转账方式


五、 Java代码实现案例

1、首先引入封装好的jar包

        <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-pay-spring-boot-starter</artifactId><version>4.4.0</version></dependency>

2、yml里面支付配置

wx:# 微信公众号mp:app-id: 微信公众号appidsecret: 微信公众号密钥token: arecatoken# 微信企业支付pay:appId: 微信公众号appidmchId: 微信企业商户号apiv3-key: api3key密钥private-key-path: 证书apiclient_keyprivate-cert-path: 证书apiclient_cert

3、具体Java代码如下

controller代码:

public class WxEntPayController {@Autowiredprivate WxEntPayService wxEntPayService;/*** 支付接口** @param entPayReq* @return*/@AutoLog(value = "支付接口")@ApiOperation(value = "支付接口", notes = "支付接口")@PostMapping(value = "/entPay")public Result<?> entPay(@RequestBody EntPayReq entPayReq) {wxEntPayService.entPay(entPayReq);return Result.OK("支付成功!");}
}

EntPayReq 实体类:

@ApiModel("企业支付请求")
@Data
public class EntPayReq {/*** <pre>* 字段名:金额.* 变量名:amount* 是否必填:是* 示例值:10099* 类型:int* 描述:企业付款金额, 单位为分* </pre>*/@NotNull(message = "金额不能为空")@Min(value = 30, message = "最小金额30分")@ApiModelProperty(value = "金额(单位分)", required = true)private Integer amount;/*** <pre>* 字段名:校验用户姓名选项.* 变量名:check_name* 是否必填:是* 示例值:OPTION_CHECK* 类型:String* 描述:NO_CHECK:不校验真实姓名 * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)* </pre>*/@ApiModelProperty(value = "校验用户姓名选项 [NO_CHECK:不校验真实姓名,FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账),OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)]")private String checkName;/*** <pre>* 字段名:收款用户姓名.* 变量名:re_user_name* 是否必填:可选* 示例值:马花花* 类型:String* 描述:收款用户真实姓名。* 如果check_name设置为FORCE_CHECK或OPTION_CHECK,  则必填用户真实姓名* </pre>*/@ApiModelProperty("收款用户真实姓名")private String reUserName;/*** <pre>* 字段名:设备号.* 变量名:device_info* 是否必填:否* 示例值:13467007045764* 类型:String(32)* 描述:微信支付分配的终端设备号* </pre>*/@ApiModelProperty("设备号")private String deviceInfo;/*** <pre>* 字段名:Ip地址.* 变量名:spbill_create_ip* 是否必填:是* 示例值:192.168.0.1* 类型:String(32)* 描述:调用接口的机器Ip地址* </pre>*/@NotBlank(message = "不能为空")@ApiModelProperty(value = "Ip地址", required = true)private String spbillCreateIp;/*** 支付订单号*/@ApiModelProperty(value = "支付订单号[非必填]")private String partnerTradeNo;/*** 批次订单号*/@ApiModelProperty(value = "批次订单号")private String batchTradeNo;
}

业务层代码:

public interface WxEntPayService {/*** 微信支付** @param entPayReq*/void entPay(EntPayReq entPayReq);
} //业务实现代码@Service
@Slf4j
public class WxEntPayServiceImpl implements WxEntPayService {@Autowiredprivate WxPayService wxPayService;/*** 不校验真实姓名.*/public static final String NO_CHECK = "NO_CHECK";/*** 微信支付** @param req*/@Overridepublic void entPay(EntPayReq req) {log.info("开始企业支付到零钱 [req:{}]",req);req.setCheckName(StringUtils.isBlank(req.getCheckName()) ? NO_CHECK : req.getCheckName());//商户订单号String partnerTradeNo = StringUtils.isNotBlank(req.getPartnerTradeNo()) ? req.getPartnerTradeNo() : RandomUtil.randomInt(20);req.setPartnerTradeNo(partnerTradeNo);//随机获取批次号  切记仅用于测试String s =  RandomNumber.GetRandom();req.setBatchTradeNo(s);TransferService transferService = wxPayService.getTransferService();//获取appIdString appId = wxPayService.getConfig().getAppId();//创建批次对象TransferBatchesRequest transferBatchesRequest=new TransferBatchesRequest();transferBatchesRequest.setAppid(appId);//设置批次名称 可不写transferBatchesRequest.setBatchName("测试批次");//设置批次备注 可不写transferBatchesRequest.setBatchRemark("测试");//设置该批次编号transferBatchesRequest.setOutBatchNo(s);//设置该批次总个数transferBatchesRequest.setTotalNum(1);//设置该批次总金额transferBatchesRequest.setTotalAmount(req.getAmount());//创建收款人请求对象ArrayList<TransferBatchesRequest.TransferDetail> transferDetails = new ArrayList<>();TransferBatchesRequest.TransferDetail transferDetail=new TransferBatchesRequest.TransferDetail();//转账的编号transferDetail.setOutDetailNo(req.getPartnerTradeNo());//转账的金额transferDetail.setTransferAmount(req.getAmount());//转账的注释transferDetail.setTransferRemark("转账金额");//以实际微信公众号那边的openid为准transferDetail.setOpenid("获取到用户的openid");//把收款人对象放到批次里面transferDetails.add(transferDetail);transferBatchesRequest.setTransferDetailList(transferDetails);TransferBatchesResult transferBatchesResult=null;try {transferBatchesResult = transferService.transferBatches(transferBatchesRequest);log.info("企业支付完成:[msg:{}]",transferBatchesResult);} catch (WxPayException e) {e.printStackTrace();log.info("企业支付失败:[msg:{}]",e.getMessage());}}

工具类代码:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.locks.ReentrantLock;public class RandomNumber {// 使用单例模式,不允许直接创建实例private RandomNumber() {}// 创建一个空实例对象,类需要用的时候才赋值private static RandomNumber instance = null;// 单例模式--懒汉模式public static synchronized RandomNumber getInstance() {if (instance == null) {instance = new RandomNumber();}return instance;}// 全局自增数private static int count = 1;// 格式化的时间字符串private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");// 获取当前时间年月日时分秒毫秒字符串private static String getNowDateStr() {return sdf.format(new Date());}// 记录上一次的时间,用来判断是否需要递增全局数private static String now = null;//定义锁对象private final static ReentrantLock lock = new ReentrantLock();//调用的方法public static String GetRandom() {String Newnumber = null;String dateStr = getNowDateStr();//加锁lock.lock();//判断是时间是否相同if (dateStr.equals(now)) {try {if (count >= 10000) {count = 1;}if (count < 10) {Newnumber = "N" + getNowDateStr() + "000" + count;} else if (count < 100) {Newnumber = "N" + getNowDateStr() + "00" + count;} else if (count < 1000) {Newnumber = "N" + getNowDateStr() + "0" + count;} else {Newnumber = "N" + getNowDateStr() + count;}count++;} catch (Exception e) {} finally {lock.unlock();}} else {count = 1;now = getNowDateStr();try {if (count >= 10000) {count = 1;}if (count < 10) {Newnumber = "N" + getNowDateStr() + "000" + count;} else if (count < 100) {Newnumber = "N" + getNowDateStr() + "00" + count;} else if (count < 1000) {Newnumber = "N" + getNowDateStr() + "0" + count;} else {Newnumber = "N" + getNowDateStr() + count;}count++;} catch (Exception e) {} finally {lock.unlock();}}return Newnumber;//返回的值}
}

这样就可以实现商家转账到零钱(单个人),该方法仅用于测试。
批量转账到零钱是为了实现一批次转账到多个账户的方法,这里我只用了一个用户转账

异常处理需要自己去写,暂时没有测试完全。

Java整合微信商家转账到个人开通流程相关推荐

  1. 网上商城建设:微信小程序直播申请开通流程及开通方法

    自从微信官方开放了小程序直播功能,第一时间成为了行业热点话题,网上直播间购物也成了消费者购物渠道之一.与此同时,商家们都在通过不同渠道尝试开通小程序直播,但又不清楚微信小程序直播申请开通流程,无从下手 ...

  2. 平台资金提现解决方案之实现微信商家转账到零钱功能

    大家好,我是小悟 使用场景 不管是做APP.电脑网站.手机网站还是小程序,为了推广基本上都离不开用户分佣的场景. 换句话说就是在其平台内为每个用户设置"电子钱包"功能,而电子钱包在 ...

  3. 微信“商家转账到零钱“功能接入以及如何获得转账结果?

    先说答案:无法即时获得转账结果 首先按照商家转账到零钱文档接入,发现响应结果中没有转账成功或者失败的结果 使用通过微信批次单号查询批次单和通过微信明细单号查询明细单接口进行转账结果查询,发现无法即时获 ...

  4. 微信商家转账到零钱超过2000对敏感信息加密获取平台证书列表

    <?phpnamespace app\common\model;use think\Db; use think\Model; use think\Config; use fast\Http; / ...

  5. 微信支付-H5网页支付开通流程

    简介  H5 支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付.主要用于触屏版的手机浏览器请求微信支付的场景.可以方便的从外 ...

  6. 微信支付:商家转账到零钱的开发

    主要所需:1.微信商户平台的证书apiclient_cert.pem 2.微信商户平台证书的密钥apiclient_key.pem 3.微信商户平台的证书的序列号 一.转账所需字段 public cl ...

  7. 怎么开通商家转账到零钱?

    目录 定义与场景 开通条件 产品优势 权限申请实操 个人浅谈 定义与场景 商家转账到零钱是微信支付商户平台推出的运营工具,可以为商户提供向一个或者同时向多个用户微信零钱转账的能力,商户可免费使用.商户 ...

  8. 商家转账到零钱快速开通方法

    什么是商家转账到零钱? 商家转账提供商户同时向多个用户微信零钱转账的能力.商户可以使用商家转账用于费用报销.员工福利发放.合作伙伴货款或服务款项支付等场景,提高转账效率. 都知道官网开通这个功能条件有 ...

  9. PHP实现微信提现V3版本2022-5更新接口:商家转账到零钱

    微信官方又更新了接口... V3版本的微信商家转账到零钱的接口---俗称提现接口 注意事项 一:开通条件:需满足入驻满90天,连续正常交易30天,保持正常健康交易. 二:分为页面发起和api接口操作, ...

最新文章

  1. SRM596 DIV2 250
  2. 异配图神经网络小结:突破同配性,拥抱异配性
  3. go语言 sync.map遍历时删除可以全部删除
  4. 堆以及stl堆的使用
  5. 字符串16进制数字转换到Ascll字符串
  6. 决策树对鸢尾花数据两特征组合分类python代码的结果_机器学习笔记-决策树
  7. 2017.5.9 积木大赛 思考记录
  8. Python爬虫扩展库BeautifulSoup4用法精要
  9. 这个工具,可视化分析10W数据后,找到了数据岗位月薪20K的秘诀
  10. 世界杯结束太快就像龙卷风,致意犹未尽的你
  11. Linux 下 Error: Could not find or load main class Hello world
  12. 干货 | 找工作的经验总结(一)
  13. java derby xsai2,java-j内的引用罐
  14. 短期通过PMP考试?
  15. 网络流(17/24)
  16. Java:使用Java调用打印机进行打印(JPG、PDF和Word三种文件格式)实现
  17. 微信小程序软件测试junit,微信小程序兼容性能测试方法
  18. w7设置双显示器_Win7如何设置双显示器?设置双显示器的方法
  19. python怎么编写对称图案_python – 无论matplotlib中的箭头角度如何,都使箭头形状对称...
  20. html标签语义化的好处,(2019)[前端]面试题[9]:HTML5语义化标签和新特性

热门文章

  1. 数据结构——课程设计之~安排教学计划
  2. 手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 #
  3. 转载 | 身份访问与管理(IAM)的定义、应用与提供商
  4. java xsl转换pdf_Java 生成PDF文档-阿里云开发者社区
  5. OpenGL shader笔记
  6. 自己制作Chrome绿色版本。
  7. Qt 信号与槽基础操作
  8. 基于MATLAB的小波阈值去噪
  9. checkedListBoxControl的用法
  10. python中库是什么意思,python中的库、包、模块和脚本是什么意思