最近在做的一个项目中涉及到了支付宝支付。在尝试了网络上的几个插件之后,发现都因为版本太老,支付宝官方提供的接口已经发生了改变,所以无法使用。于是决定自己动手编写一个最新版的支付宝插件,下面我们进入主题。
1、创建插件目录
新建一个文件夹,作为插件根目录,在根目录中新建两个文件夹,一个为src存放原生代码源文件,一个为www存放插件js文件。另外在根目录下创建plugin.xml文件,用于写入插件配置。
2、编写alipay.js
var exec = require('cordova/exec');
var Alipay = {
/**
* 支付宝支付业务
*
* @param price 付款金额
* @param subject 主题
* @param body 详情
* @param tradeNo 订单号
*/
pay:function(onSuccess, onError, price, subject, body, tradeNo) {
exec(
onSuccess,
onError,
"AlipayPlugin",
"alipay",
[price, subject, body, tradeNo]
);
}
}
module.exports = Alipay;
第一个参数为支付成功后的回调方法,第二个参数为失败后的回调方法。
3、编写原生代码
3.1 Andoid原生
首先在src目录下,创建android和ios目录,用于存放两个平台的原生代码及库文件,在这里我用的是支付宝的20161222版本,是截止到本文发布时的最新版本。
去支付宝官网下载最新demo,然后将其中的工具类、jar包以及资源文件拷贝到android目录下,新建一个类命名为AlipayPlugin.java,继承CordovaPlugin,用于存放支付宝的支付逻辑。
package com.beanyon.alipay;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.alipay.sdk.app.PayTask;
import com.beanyon.alipay.util.OrderInfoUtil2_0;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.Map;
/**
* Created by BeanYon on 2017/1/6.
*/
public class AlipayPlugin extends CordovaPlugin {
private Context mContext = null;
private final String ACTION_FLAG = "alipay";//传入的action参照
CallbackContext currentCallbackContext;//回调参数
/**
* 支付宝支付业务:入参app_id
*/
public static final String APPID = "你的app_id";
/** 商户私钥,pkcs8格式 */
/** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */
/** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */
/** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */
/** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */
/**
* 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
*/
public static final String RSA2_PRIVATE = "your_private_key";
public static final String RSA_PRIVATE = "";
private static final int SDK_PAY_FLAG = 1;
@Override
public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
currentCallbackContext = callbackContext;
mContext = cordova.getActivity();
if (ACTION_FLAG.equals(action)) {
return payV2(args.getString(0),args.getString(1),args.getString(2),args.getString(3));//调用支付宝付款
}
return true;
}
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
*对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(mContext, "支付成功", Toast.LENGTH_SHORT).show();