美文网首页
微信支付和支付宝支付的Cordova插件

微信支付和支付宝支付的Cordova插件

作者: 风雪涟漪 | 来源:发表于2018-12-06 23:49 被阅读0次

    微信支付和支付宝支付的Cordova插件

    微信支付和支付宝支付在是常用的支付方式,现在在应用上是普遍都会有支付功能。

    原生应用的支付参照微信支付和支付宝支付的集成也就满足使用了,本文是将微信支付和支付宝支付做成Cordova插件方式提供给H5应用调用进行支付。使用JS桥方式替换Cordova方式也是类似。

    Cordova支付插件流程时序大概如下图:


    支付时序图.png

    流程:

    1、订单支付界面H5中发起支付行为,将订单信息传递给支付JS(对Cordova进行统一封装);
    
    2、支付JS对订单信息里的必须参数作错误检查,对订单信息进行封装成Cordova的参数方式JSONArray,传递给Cordova;
    
    3、Cordova将订单信息传递给支付插件;
    
    4、支付插件按支付集成文档进行集成并将支付结果进行封装回调;
    

    在此过程,H5页面可能会因订单信息格式或订单信息参数又或者签名而导致失败N次~严重的程序闪退。所以,很有必要对H5界面的订单信息做错误检查。因原生支付需要Android和iOS两端,所以为了省功夫,错误检查放在支付JS里,也就是第2步。

    检查内容有:

    1、订单类型信息类型(微信为JSON类型,支付宝为String类型);

    2、订单必要参数,微信支付或支付宝支付要求必须要有的参数检查。

    微信支付JS

    
    (function(window) {
    
      window.app = window.app || {};
    
      window.app.wxpay = window.app.wxpay || {};
    
      /**
    
      * 微信支付方法
    
      * orderInfo 订单信息,JSON类型
    
      * successCallback(string) 支付成功回调
    
      * errorCallback(String) 支付失败回调
    
      */
    
      app.wxpay.pay = function(orderInfo, successCallback, errorCallback) {
    
        // 订单信息应该为json格式
    
        if ("object" == (typeof orderInfo)) {
    
          // 检查订单中的必须元素
    
          var check = paramsCheck(orderInfo);
    
          if (check != null) {
    
            errorCallback(check);
    
            return;
    
          }
    
        } else {
    
          errorCallback("参数orderInfo错误,应用为JSON类型");
    
          return;
    
        }
    
        // 对订单信息进行封装
    
        var param = {
    
          "orderInfo": orderInfo
    
        }
    
        // 调用原生支付
    
        Cordova.exec(successCallback, errorCallback, "WXPay", "pay", [param]);
    
      }
    
      // 检查元素:appid、partnerid、prepayid、noncestr、timestamp、package、sign
    
      function paramsCheck(param) {
    
        var keys = ["appid", "partnerid", "prepayid", "noncestr", "timestamp", "package", "sign"];
    
        var values = [param.appid, param.partnerid, param.prepayid, param.noncestr, param.timestamp, param.package, param.sign];
    
        for (var i = 0; i < keys.length; i++) {
    
          console.log("key=" + keys[i] + " and value = " + values[i]);
    
          if (values[i] == null) {
    
            return "缺少参数" + keys[i];
    
          }
    
        }
    
        return null;
    
      }
    
    })(window);
    
    

    支付宝的支付JS

    
    (function(window) {
    
      window.app = window.app || {};
    
      window.app.alipay = window.app.alipay || {};
    
      /**
    
      * 支付宝支付
    
      * orderInfo 订单信息,String类型
    
      * successCallback(string) 支付成功回调
    
      * errorCallback(String) 支付失败回调
    
      */
    
      app.alipay.pay = function(orderInfo, successCallback, errorCallback) {
    
        // 判断订单信息是否符合
    
        // 订单必须是String类型,
    
        if ("string" == (typeof orderInfo)) {
    
          // 检查订单中的必须元素
    
          var checkStr = paramsCheck(orderInfo);
    
          if (checkStr != null) {
    
            errorCallback(checkStr);
    
            return;
    
          }
    
        } else {
    
          errorCallback("参数格式错误,应用为String类型");
    
          return;
    
        }
    
        // 对订单信息进行封装
    
        var param = {
    
          "orderInfo": orderInfo
    
        }
    
        // 调用原生支付
    
        Cordova.exec(successCallback, errorCallback, "Alipay", "pay", [param]);
    
      }
    
      // 错误检查
    
      // 检查是否有必要的植app_id,biz_content,method,sign_type,timestamp,sign,charset,version
    
      function paramsCheck(param) {
    
        // 将键值对存入Map
    
        var keyValuePairs = param.split("&");
    
        var kvMap = new Map();
    
        for (var i = 0; i < keyValuePairs.length; i++) {
    
          var keyValue = keyValuePairs[i].split("=");
    
          if (keyValue.length == 2) { // 确定有值[key,value]
    
            kvMap.set(keyValue[0], keyValue[1]);
    
          }
    
        }
    
        // 检查的元素
    
        var keys = ["app_id", "biz_content", "method", "sign_type", "timestamp", "sign", "charset", "version"];
    
        for (var i = 0; i < keys.length; i++) {
    
          var key = keys[i];
    
          var str = kvMap.get(key);
    
          if (str == null) {
    
            return "缺少参数" + key;
    
          }
    
        }
    
        return null;
    
      }
    
    })(window);
    
    

    相关文章

      网友评论

          本文标题:微信支付和支付宝支付的Cordova插件

          本文链接:https://www.haomeiwen.com/subject/ujqzcqtx.html