-一 调用支付
-二 异步通知
-三 前端实现
- 如果您app中可以接入 支付宝SDK,那可以使用app支付接口,如果不能使用,那只能接入手机网站支付接口
- 功能一样的,手机网站支付接口一样是唤起支付宝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)
})
-----都看到这了,觉得有用的话,点个赞再走呗----