在【微信小程序】中实现 【支付宝支付】是一种什么样的体验?

1,142 阅读6分钟

前言

一名自由职业的程序员的独立开发之路
自己的微信小程序中需要实现 企业向个人付款的需求,前前后后折腾了一段时间
各种问题,各种坑都有,有技术类的,有非技术类
此篇文章做一个记录,希望能帮助到各位
有问题大家可以留言交流

微信小程序中实现企业支付到个人的几种方式对比

微信提供给我们有几种的对接方式,但是一般不管哪一种,必须满足三个开通条件

image.png

  • 入驻满90天

  • 连续正常交易30天

    这个需要你申请开通功能之前,连续30天有交易,也就是每天转几块钱到企业账户即可,中间一天都不能断,断了就得重新开始,这个非常容易忘记,导致又得等30天

  • 保持正常健康交易

    如果你的主体账号关联的小程序,或者公众号 有被投诉的话,那么就有可能申请被拒,反正尽量不要有投诉

多种方式总览

微信支付-总览.png

第一种 - 小程序红包

功能介绍

主要是用来作为营销工具用的
场景:用户打开小程序,跳出红包,用户点击领取
用户不点击红包领取,那么24小时之后,还会退回到用户的账号

结论:

不适用,我们的场景是用户点击提现,直接钱打到用户的微信零钱里面

小程序红包.png

第二种 - 企业付款到零钱

该种方式已经关闭,我以前对接过,其实现在换成了另外一种 【商家付款到零钱】

image.png

第三种 - 商家付款到零钱

功能介绍

这其实最符合我的需求的,直接调用接口,付款到用户的零钱,也比较方便

申请

申请的时候需要提交很多的材料,就是说明你的业务场景,我这边也是按照规定提交了,
但是相信做过的朋友应该都被卡在了这一关了,申请被拒绝了
原来关于虚拟产品微信支付有着比较严格的审核

说明(其实是吐槽)

  • 微信支付的客服电话,或者其他的沟通方式,基本没有,电话打不进,没有办法沟通,干着急
  • 审核时间太长,没有具体的时间,我在驳回之后,又改了改,重新提交,已经快2个礼拜了,还是审核中

商家转账到零钱-驳回.png

image.png

结论:等他回复你,或者给你结果,黄花菜都凉了

第四种 - 企业付款到银行卡

功能介绍

企业账户的钱直接付款到个人银行卡,满足功能

企业付款到银行卡.png

特点

  • 目前支持17家银行,更多银行逐步开放
  • T+1工作日入账(受部分银行影响可能会更久)
  • 按单笔金额收取,T+1到账,每笔收取0.1%,最低1元,最高25元

企业付款到银行卡-手续费.png

对接功能过程

  • 直接使用 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'企业付款到银行卡描述信息'
    });
    
    
  • 调试成功

企业付款到银行卡-调试通了.png

结论:放弃

  • 我们的业务提现都是 几块钱,费用太高了
  • 隔天到账,时效性太低了

截止到现在,微信商家付款到个人的路因为不同的原因都被堵死了,此时此刻,我们是绝望的,太难了
国内做支付的公司其实也不多,要么 微信,要么支付宝
啥?
支付宝?
在小程序里?
不可能
管它呢
死马当活马医

支付宝的对接【重点戏】

具体流程

开户

  • 需要在支付宝开放平台注册为为商家

  • 商家认证

    支付宝的商家认证,有专门的销售对接,非常方便,只需要打印一个门头,贴在墙上,拍照即可,审核很快

  • 创建应用

支付宝-创建应用.png

获取证书和私钥

生成秘钥-1.png

生成秘钥-2.png

  • 私钥的格式转换(node 需要把格式转换下)

    pkcs1:适用于php ,.net、node.js等开发语言;
    pkcs8:适用于java,安卓 ,ios等开发语言;

密钥格式转换.png

  • 证书的获取
    • 第一步

      证书获取-1.png

    • 第二步 证书获取-2.png

    • 第三步

      证书获取-3.png

    • 第四步

      证书获取-4.png

    • 第五步 获取证书-5.png

遇到的问题总结

  • 密钥格式的问题 选择的是pkcs1

    这个在上面的时候已经提过了,node必须用pkcs1

  • 多个证书的对应关系错误

    建议在证书一个个下载(也就是上面的第五步)

    5b0ccfc515387e028ba92e52d454d7a.png

示例代码

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);
});

上线流程

因为是在 微信小程序中使用,所以审核是个大问题,来来回回折腾了好久

关于小程序审核相关的所有的问题,我将放在下一期的文章中 ...

总结

对接支付其实倒不是什么难事,但是涉及到审核,客服的咨询,技术的支持

我在不同平台之间也算是有一点点经验了,有这方面问题的朋友可以共同交流