后端:nodejs 支付宝-手机网站支付 (混合应用APP/h5可以走这种支付方式)

-一 调用支付
-二 异步通知
-三 前端实现

  1. 如果您app中可以接入 支付宝SDK,那可以使用app支付接口,如果不能使用,那只能接入手机网站支付接口
  2. 功能一样的,手机网站支付接口一样是唤起支付宝app进行支付。
    只是app中使用app支付接口能够提高唤起支付宝app 的概率

先看官方文档(手机网站支付板块下的): 地址
在这里插入图片描述

有问题找客服

在线商户客服(右侧图标点立即咨询-随便输入问题-点击请进入人工服务):【https://opensupport.alipay.com/support/home.htm】

一: 调用支付
1.支付宝开放平台控制台创建应用-添加手机网站支付能力并签约
2.支付宝开放平台开发助手生成密钥,并上传支付宝开放平台控制台对应应用的接口加签上
nodejs要选非java方式生成密钥,否则会报这个错误(nodejs)
在这里插入图片描述

  • 应用网关:如果您现在开发的接口不是生活号,口碑开店,请勿配置应用网关,如果已经配置可以删除或者不管也不会对您开发的接口有任何影响;可以不用配置,不影响审核。
  • 授权回调地址:顾名思义仅用于授权接口。使用接口第三方应用授权和用户信息授权
  • 电脑网站,手机网站。app支付,当面付,这些接口都不需要填写应用授权回调地址和应用网关,直接提交应用审核上线即可
    3.这一步有两种方法

签名是在服务端(这里是node)实现的,客户端通过签名字符串或链接发起支付.这里手机网站支付走的是链接

方法一: 使用支付宝的sdk生成签名
//自带验签,推荐使用

npm i alipay-sdk
router.get('/h5App', function (req, res) {
  // 二: sdk签名
  const AlipaySdk = require('alipay-sdk').default;
  const AlipayFormData = require('alipay-sdk/lib/form').default;
  const alipaySdk = new AlipaySdk({
    /** 支付宝网关 **/
    gateway: 'https://openapi.alipay.com/gateway.do',
    appId: config.app_id2,
    privateKey: '', // 应用私钥
    alipayPublicKey: '', // 支付宝公钥
    signType: 'RSA2',
  });
  const formData = new AlipayFormData();
  formData.setMethod('get');
  formData.addField('bizContent', {
    outTradeNo: '', // 订单号
    productCode: 'QUICK_WAP_WAY',
    totalAmount: '0.01',
    subject: 'biaoti标题',
    body: 'miaoshu描述',
  });

  console.log(formData)
  console.log(formData.fields[0].value)

  // formData.addField('returnUrl', ''); // 回调地址,调用支付时不是必要的

  const result = alipaySdk.exec('alipay.trade.wap.pay', {}, {
    formData: formData
  }, { validateSign: true }).then(result => {
    console.log('支付宝返回支付链接:',result);
    res.send(result)
  });
 
})

在这里插入图片描述
关于-发送请求的方式
在这里插入图片描述
在这里插入图片描述

请添加图片描述

方法二: 自签名 文档链接
node平台不推荐,客服不会帮你解决自签名问题
1)准备好公共参数和接口参数
2)生成签名字段sign
//流程:得到参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数 — 按照字符的键值ASCII码递增排序–组合成“参数=参数值”的格式并用&字符连接 — 通过私钥给字符串签名(nodejs平台有签名方法)
3) 拼接代签名字符串
4)验证密钥匹配: 开发助手-密钥匹配
在这里插入图片描述
对比签名字段是否一致: 开发助手-签名
在这里插入图片描述
5)拼接网关发起支付
在这里插入图片描述
在这里插入图片描述

花了好几天问了n个客服没解决,算了不使用这种方式了

4.提示-申请网站支付时备案主题必须一致
在这里插入图片描述
二: 异步通知

关于支付结果通知
----对于手机网站支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统
在这里插入图片描述

关于回调地址
1)不能是IP地址(必须是域名)不能带端口,预设80端口 不能带参数
2)(如果链接无法访问,商户将无法接收到通知。)
3)不能加?id=123这类自定义参数

使用文档: 链接
收不到异步通知的排查: 链接

示例

 formData.addField('notifyUrl', 'http://www.baidu.top/ali/payment') //公共请求参数
const AlipaySdk = require('alipay-sdk').default;

router.all('/payment', function (req, res, next) {
  // 通过req.body拿到支付宝系统返回的支付结果
  console.log('响应数据', req.body)
  // 验签
  let returnData = req.body
  if (returnData) {
    const verify = alipaySdk.checkNotifySign(returnData);
    console.log(verify)
    if(verify){
      // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
      // 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
      // 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
      if(returnData.trade_status == 'TRADE_SUCCESS'){ //交易状态:买家已付款
        res.end('success')
      }
    }
  }
  // 返回给支付宝数据
  res.end('123')
  // console.log('打印sdk验签方法', AlipaySdk.checkNotifySign)
})
-----都看到这了,觉得有用的话,点个赞再走呗----
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值