2021-09-27

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浏览器正常

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值