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