nodejs h5调起支付宝app无反应
感谢大家的无私奉献,第一天写笔记,记录自己,参考他人
nodejs sdk参考
https://www.yuque.com/chenqiu/alipay-node-sdk/guide
router中使用
const AlipaySDK = require("alipay-sdk").default; // 导入 SDK
// 引入 alipayFormData 构造函数,用来创建网站支付需要的 form 表单
const AlipayFormData = require('alipay-sdk/lib/form').default;
let params = {
appId: ''
privateKey: fs.readFileSync(path.join(__dirname,'..alipayPrivateKey.txt'), 'ascii'), // 应用私钥
alipayPublicKey: fs.readFileSync(path.join(__dirname,'../alipayPublicKey.txt'), 'ascii'),// 支付宝公钥
// gateway: 'https://openapi.alipaydev.com/gateway.do', // 支付宝的应用网关,此时为沙箱环境的网关
gateway: 'https://openapi.alipay.com/gateway.do', // 支付宝的应用网关,此时为正式环境的网关
charset: 'utf-8', // 字符集编码
version: '1.0', // 版本,默认 1.0
signType: 'RSA2', // 秘钥的解码版本
};
this.alipay = new AlipaySDK(params);
...业务原因无法提供完整代码
async createOrder(order, goods) {
let method, productCode;
if (移动页面) {
method = 'alipay.trade.wap.pay';
productCode = "QUICK_WAP_PAY";
} else {
//pc页面
method = 'alipay.trade.page.pay';
productCode = "FAST_INSTANT_TRADE_PAY";
}
// 通过 bizContent 传递请求参数
let bizContent = {
outTradeNo: order[constants.orderConstants.ID],//商户订单号
productCode: productCode,//两个固定参数
totalAmount: order[constants.orderConstants.PAYMENT],//总价
subject:(“描述”),
// timeoutExpress: '5s',
quitUrl: "https://" + this.context.request.headers.host + myNetUtils.requestConstants.pathConstants.paymentPath.quitUrl,
// body:"body",//
// passback_params: '',//
};
下面部分比较重要
let alipayFormData = new AlipayFormData();
alipayFormData.addField('bizContent', bizContent);
alipayFormData.addField('notifyUrl',“阿里服务器会在请求做出后通过post请求访问这个地址”);
alipayFormData.addField('returnUrl',“商户自定义一个回执响应页面,该页面会携带一些订单完成信息,打印context.request.body即可知道了”);
return this.alipay.exec(method, {}, {formData: alipayFormData});//
}
//返回给前端,里面会是一个 自动执行的form表单
context.body=await createOrder(order,goods);
context.end;
异常情况:
这里主要记录一个不容易发现的异常,就是在很多安全限制要求高的浏览器中,打开了支付页面,但就是无法唤起支付宝app
异常信息:
Failed to launch 'alipays://platformapi…because the scheme does not have a registered handler.
原因分析:
其中之一就是同源限制
1:在iframe中打开支付页面可能会出现这种问题
2.协议不同,向我这种开发环境和生产环境 http和https相互切换就发现了这个问题,踩了好久的坑,最后因为客户反应浏览速度变慢才发现是因为使用了开发环境禁用缓存导致,最终推断出协议线上协议未切换,调用浏览器果然报同源警告,另外在支付宝内部浏览器、uc浏览器正常