phonegap(cordova) 自定义插件代码篇(三)----支付宝支付工具整合

建议读者,先阅读官方文档,知晓其支付流程之后再来使用此代码,比如客户需要做什么,服务端需要做什么(很重要!很重要!很重要!),因为这几个篇幅都是纯代码篇,因为阅读前面的入门篇之后看这些应该毫无问题才对,否则就是没入门,上代码

公用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)//验证成功
            {
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //请在这里加上商户的业务逻辑程序代码 

                //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

                //商户订单号

                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;
            }
        }


猜你喜欢

转载自blog.csdn.net/zlj002/article/details/50463203