建议读者,先阅读官方文档,知晓其支付流程之后再来使用此代码,比方客户须要做什么,服务端须要做什么(非常重要!非常重要!
非常重要!),由于这几个篇幅都是纯代码篇,由于阅读前面的入门篇之后看这些应该毫无问题才对,否则就是没入门。上代码
公用js
(function (cordova) {
var define = cordova.define;
define("cordova/plugin/alipay", function (require, exports, module) {
var argscheck = require('cordova/argscheck'),
exec = require('cordova/exec');
exports.pay = function (orderInfo, successCB, failCB) {
argscheck.checkArgs('AFF', 'alipay.pay', arguments);
if (!orderInfo) {
failCB && failCB("请输入订单信息.");
} else {
exec(successCB, failCB, "Alipay", "pay", orderInfo);
}
};
});
cordova.addConstructor(function () {
if (!window.plugins) {
window.plugins = {};
}
//console.log("将插件注入cordovaAlipay...");
window.plugins.alipay = cordova.require("cordova/plugin/alipay");
//console.log("alipay注入结果:" + typeof (window.plugins.alipay));
});
})(cordova);
android版
public class AlipayPlugin extends CordovaPlugin {
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case Constants.Alipay.SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
String out_trade_no = payResult.getOut_trade_no();
// 推断resultStatus 为“9000”则代表支付成功。详细状态码代表含义可參考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
// 通知到页面 支付工具 0--微信 1--支付宝 2--银联
String jsCode = "pay.result('1','" + out_trade_no + "','true')";
yooshow.instance.ToJS(jsCode);
} else {
// 推断resultStatus 为非“9000”则代表可能支付失败
// “8000”代表支付结果由于支付渠道原因或者系统原因还在等待支付结果确认,终于交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
// 通知到页面
String jsCode = "pay.result('1','" + out_trade_no
+ "','true')";
yooshow.instance.ToJS(jsCode);
} else {
// 其它值就能够推断为支付失败。包括用户主动取消支付。或者系统返回的错误
// 通知到页面
String jsCode = "pay.result('1','" + out_trade_no
+ "','false')";
yooshow.instance.ToJS(jsCode);
}
}
break;
}
case Constants.Alipay.SDK_CHECK_FLAG: {
// Toast.makeText(currentActivity, "检查结果为:" + msg.obj,
// Toast.LENGTH_SHORT).show();
break;
}
default:
break;
}
};
};
@Override
public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {
final Activity currentActivity = this.cordova.getActivity();
// // 构造订单信息
// // 订单编号
// String orderNo = args.getString(0);
// // 商品名称
// String productName = args.getString(1);
// // 商品描写叙述
// String productDesc = args.getString(2);
// // 商品总价
// String productTotal_fee = args.getString(3);
//
// // 订单
// String orderInfo = getOrderInfo(orderNo, productName, productDesc,
// productTotal_fee);
//
// // 对订单做RSA 签名
// String sign = sign(orderInfo);
//
// try {
// // 仅需对sign 做URL编码
// sign = URLEncoder.encode(sign, "UTF-8");
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
//
// // 完整的符合支付宝參数规范的订单信息
// final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
// + getSignType();
// 改动为直接传递服务端签名(已经包括订单信息和签名信息)
final String payInfo = args.getString(0);
// Log.i("alipay", payInfo);
if ("pay".equals(action)) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(currentActivity);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = Constants.Alipay.SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
callbackContext.success();
return true;
} else {
return false;
}
}
}
iOS
#import <Cordova/CDV.h>
@interface CDVAlipay : CDVPlugin
@property (nonatomic,copy) NSString*callbackID;
//Instance Method
-(void) pay:(CDVInvokedUrlCommand*)command ;
@end
#import "CDVAlipay.h"
#import "Order.h"
#import "Conts.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>
#import "AppDelegate.h"
@implementation CDVAlipay
@synthesize callbackID;
-(void)pay:(CDVInvokedUrlCommand *)command
{
//应用注冊scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @"yooshow";
//将签名成功字符串格式化为订单字符串,请严格依照该格式
NSString *orderString = nil;
orderString = [command.arguments objectAtIndex:0];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
//状态
NSString* resultStatus = [resultDic objectForKey:@"resultStatus"];
NSString* msg = @"false";
if([resultStatus isEqualToString:@"9000"] || [resultStatus isEqualToString:@"8000"] ){
msg = @"true";
}
//获取订单号
NSString * result = [resultDic objectForKey:@"result"];
NSString* out_trade_no = [self getOut_trade_no:result];
//通知到界面 //0--微信 1--支付宝 2--银联
NSString *js = [[NSString alloc]initWithFormat:@"pay.result('1','%@','%@')", out_trade_no,msg ];
[[AppDelegate appDelegate] runJS:js];
}];
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@""];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
-(NSString*) getOut_trade_no:(NSString*) result
{
NSString* out_trade_no = @"";
NSArray *parames = [result componentsSeparatedByString:@"&"];
for (NSUInteger i = 0; i < parames.count; i++)
{
NSString* p = parames[i];
NSRange range = [p rangeOfString:@"out_trade_no"];
if(range.location==0){
NSArray *keyValue = [p componentsSeparatedByString:@"="];
if(keyValue!=nil && keyValue.count>1){
@try{
out_trade_no = keyValue[1];
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\""];
out_trade_no= [out_trade_no stringByTrimmingCharactersInSet:set];
// NSLog(@"终于的订单号>>>>>>>>>>%@", out_trade_no);
}@catch (NSException * e) {
// NSLog(@"Exception: %@", e);
}
}
}
}
return out_trade_no;
}
@end
服务端的通知页面安装官方的要求做,验证之后做业务处理。比方添加账号剩余金额,我还是上一段代码吧,我使用的c#
/// <summary>
/// 支付宝签名(包括订单信息+签名)
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public string AlipaySign(AlipayParam param)
{
//获取第三方(alipay) 配置信息
ThirdPartyConfig config = AppService.Instance.GetThirdPartyConfig();
//构造须要签名的内容
string orderInfo = AlipayCore.GetOrderInfo(param.OrderNO, param.Subject, param.Body, param.Price, config.AlipayPartner, config.AlipaySeller, config.AlipayServer_Notify);
//签名
var signed = RSAFromPkcs8.Sign(orderInfo, config.AlipayPrivate_Key, "UTF-8");
//编码签名后的值。而且构造返回结果
var result = orderInfo + "&sign=\"" + HttpUtility.UrlEncode(signed, Encoding.UTF8) + "\"&sign_type=\"" + config.AlipaySignType + "\"";
return result;
}
/// <summary>
/// 验证阿里支付回调。假设通过则处理订单。并返回true ,假设验证失败则直接返回false
/// </summary>
/// <param name="sPara"></param>
/// <returns></returns>
public bool AlipayNotifyVerify(SortedDictionary<string, string> sPara)
{
var config = AppService.Instance.GetThirdPartyConfig();
Notify aliNotify = new Notify(config.AlipayPartner, "utf-8", "RSA");
bool verifyResult = aliNotify.Verify(sPara, sPara["notify_id"], sPara["sign"]);
if (verifyResult)//验证成功
{
/
//请在这里加上商户的业务逻辑程序代码
//——请依据您的业务逻辑来编敲代码(下面代码仅作參考)——
//获取支付宝的通知返回參数。可參考技术文档中server异步通知參数列表
//商户订单号
string out_trade_no = sPara["out_trade_no"];
//支付宝交易号
string trade_no = sPara["trade_no"];
//交易状态
string trade_status = sPara["trade_status"];
string seller_email = sPara["seller_email"];
string buyer_email = sPara["buyer_email"];
string total_fee = sPara["total_fee"];
//买家付款时间
string gmt_payment = sPara["gmt_payment"];
if (sPara["trade_status"] == "TRADE_SUCCESS" || sPara["trade_status"] == "TRADE_FINISHED")
{
//推断该笔订单是否在商户站点中已经做过处理
//假设没有做过处理。依据订单号(out_trade_no)在商户站点的订单系统中查到该笔订单的具体,并运行商户的业务程序
//假设有做过处理,不运行商户的业务程序
//注意:
//该种交易状态仅仅在两种情况下出现
//1、开通了普通即时到账,买家付款成功后。
//2、开通了高级即时到账。从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。
//成功之后改动订单状态,记帐,加花
OrderPaySuccessParam param = new OrderPaySuccessParam();
//订单号
param.OrderNO = out_trade_no;
//支付宝交易号
param.TradeNO = trade_no;
//支付方式
param.PayMethod = PaymentMethodKind.Online;
//卖家收款账户
param.Account = seller_email;
//卖家收款账户银行
param.Bank = PayTypeKind.AliPay.ToString();
//买家账户
param.PayAccount = buyer_email;
//买家收款账户银行
param.PayBank = PayTypeKind.AliPay.ToString();
//实际支付金额
param.TotalAmount = Convert.ToDouble(total_fee);
//支付时间
param.PayDate = Convert.ToDateTime(gmt_payment);
//支付工具类型
param.PayType = PayTypeKind.AliPay;
OrderService.Instance.OrderPaySuccess(param);
}
else
{
}
return true;
}
else
{
return false;
}
}