前言
一名自由职业的程序员的独立开发之路
自己的微信小程序中需要实现 企业向个人付款的需求,前前后后折腾了一段时间
各种问题,各种坑都有,有技术类的,有非技术类
此篇文章做一个记录,希望能帮助到各位
有问题大家可以留言交流
微信小程序中实现企业支付到个人的几种方式对比
微信提供给我们有几种的对接方式,但是一般不管哪一种,必须满足三个开通条件
-
入驻满90天
-
连续正常交易30天
这个需要你申请开通功能之前,连续30天有交易,也就是每天转几块钱到企业账户即可,中间一天都不能断,断了就得重新开始,这个非常容易忘记,导致又得等30天
-
保持正常健康交易
如果你的主体账号关联的小程序,或者公众号 有被投诉的话,那么就有可能申请被拒,反正尽量不要有投诉
多种方式总览
第一种 - 小程序红包
功能介绍
主要是用来作为营销工具用的
场景:用户打开小程序,跳出红包,用户点击领取
用户不点击红包领取,那么24小时之后,还会退回到用户的账号
结论:
不适用,我们的场景是用户点击提现,直接钱打到用户的微信零钱里面
第二种 - 企业付款到零钱
该种方式已经关闭,我以前对接过,其实现在换成了另外一种 【商家付款到零钱】
第三种 - 商家付款到零钱
功能介绍
这其实最符合我的需求的,直接调用接口,付款到用户的零钱,也比较方便
申请
申请的时候需要提交很多的材料,就是说明你的业务场景,我这边也是按照规定提交了,
但是相信做过的朋友应该都被卡在了这一关了,申请被拒绝了
原来关于虚拟产品微信支付有着比较严格的审核
说明(其实是吐槽)
- 微信支付的客服电话,或者其他的沟通方式,基本没有,电话打不进,没有办法沟通,干着急
- 审核时间太长,没有具体的时间,我在驳回之后,又改了改,重新提交,已经快2个礼拜了,还是审核中
结论:等他回复你,或者给你结果,黄花菜都凉了
第四种 - 企业付款到银行卡
功能介绍
企业账户的钱直接付款到个人银行卡,满足功能
特点
- 目前支持17家银行,更多银行逐步开放
- T+1工作日入账(受部分银行影响可能会更久)
- 按单笔金额收取,T+1到账,每笔收取0.1%,最低1元,最高25元
对接功能过程
- 直接使用 Node的插件 tenpay传送门
- 按照 tenpay
- 获取相关商户的参数与相关证书
- appid 等商户信息参数比较简单,直接在商户号里面获取即可
- 调用 接口
# 第一步-实例化 const tenpay = require('tenpay'); const config = { appid: '公众号ID', mchid: '微信商户号', partnerKey: '微信支付安全密钥', //最好不要放在代码里,放在服务器中 pfx: require('fs').readFileSync('证书文件路径'), // 最好放在代码里,放在服务器上 notify_url: '支付回调网址', // 回调对账接口,这个就是对比 支付是否成功的,一般个人支付给商家是一点要对接的 spbill_create_ip: 'IP地址' }; // 方式一 const api = new tenpay(config); // 方式二 const api = tenpay.init(config); // 调试模式(传入第二个参数为true, 可在控制台输出数据) const api = new tenpay(config, true); # 企业付款到银行卡 let result = await api.payBank({ partner_trade_no: '商户内部付款订单号', // 自己随便定义,只要唯一即可 bank_code: '收款方开户行', // 微信开发文档有一个对照表,每家银行有对应的code enc_bank_no: '收款方银行卡号', enc_true_name: '收款方用户名', amount: '付款金额(分)', desc: '企业付款到银行卡描述信息' });
- 调试成功
结论:放弃
- 我们的业务提现都是 几块钱,费用太高了
- 隔天到账,时效性太低了
截止到现在,微信商家付款到个人的路因为不同的原因都被堵死了,此时此刻,我们是绝望的,太难了
国内做支付的公司其实也不多,要么 微信,要么支付宝
啥?
支付宝?
在小程序里?
不可能
管它呢
死马当活马医
支付宝的对接【重点戏】
具体流程
开户
-
需要在支付宝开放平台注册为为商家
-
商家认证
支付宝的商家认证,有专门的销售对接,非常方便,只需要打印一个门头,贴在墙上,拍照即可,审核很快
-
创建应用
获取证书和私钥
- 下载工具 opendocs.alipay.com/common/02ki…
- 私钥的获取 - 直接看图即可
-
私钥的格式转换(node 需要把格式转换下)
pkcs1:适用于php ,.net、node.js等开发语言;
pkcs8:适用于java,安卓 ,ios等开发语言;
- 证书的获取
-
第一步
-
第二步
-
第三步
-
第四步
-
第五步
-
遇到的问题总结
-
密钥格式的问题 选择的是pkcs1
这个在上面的时候已经提过了,node必须用pkcs1
-
多个证书的对应关系错误
建议在证书一个个下载(也就是上面的第五步)
示例代码
const AlipaySdk= require('alipay-sdk').default;
const alipaySdk = new AlipaySdk({
/** 支付宝网关 **/
gateway:'https://openapi.alipay.com/gateway.do',
/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
appId: ' ',
/** 应用私钥,密钥格式为pkcs1,如何获取私钥请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
privateKey:' ',
/** 应用公钥证书路径,下载后保存位置的绝对路径 **/
alipayRootCertPath: ' ',
/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
appCertPath: ' ',
/** 支付宝根证书路径,下载后保存位置的绝对路径 **/
alipayPublicCertPath: ' ',
/** 设置签名类型 **/
signType:'RSA2',
});
const result =alipaySdk.exec('alipay.fund.trans.uni.transfer',{
/** 设置业务参数 **/
bizContent: {
/** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/
outBizNo: '2020062900001',
/** 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/
transAmount: '0.1',
/** 单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD **/
productCode: 'TRANS_ACCOUNT_NO_PWD',
/** 设转账业务的标题,用于在支付宝用户的账单里显示 **/
bizScene: 'DIRECT_TRANSFER',
/** 转账业务的标题,用于在支付宝用户的账单里显示 **/
orderTitle: '转账标题',
/** 设置业务参数,业务备注 **/
remark: '单笔转账',
payeeInfo:{
/** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/
identity:'208*****54',
/** ALIPAY_USER_ID 支付宝的会员ID **/
identityType:'ALIPAY_USER_ID',
/** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填 **/
name:'张三',
},
},
//validateSign设置为true校验支付宝公钥是否正确; 如果不传递 默认为false/
},{validateSign:true}).then(result => {
console.log(result);
});
上线流程
因为是在 微信小程序中使用,所以审核是个大问题,来来回回折腾了好久
关于小程序审核相关的所有的问题,我将放在下一期的文章中 ...
总结
对接支付其实倒不是什么难事,但是涉及到审核,客服的咨询,技术的支持
我在不同平台之间也算是有一点点经验了,有这方面问题的朋友可以共同交流