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

微信支付和支付宝支付的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);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。