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

公用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;}};};@Overridepublic 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() {@Overridepublic 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 typesNSString *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;}}

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

  1. Cordova应用的JavaScript代码和自定义插件代码的调试

    我之前写过三篇Cordova相关的技术文章.当我们使用Cordova将自己开发的前端应用打包安装到手机上后,可能会遇到需要调试Cordova应用的时候. 本文就介绍Cordova应用的调试步骤. 如果 ...

  2. cordova自定义android插件,Cordova 自定义插件(Android版本)

    Cordova 自定义插件(android) 特别注意 android 项目的包名 必须为 com.example.hello,否则编译不会通过. 1.安装命令工具 $ npm i plugman - ...

  3. 用Kotlin撸一个图片压缩插件-实战篇(三)

    简述: 由于个人原因,已经有很长一段时间没有写过文章,有句话是那么说的只要开始就不会太晚,所以我们开始<用Kotlin撸一个图片压缩插件>系列文章最后一篇实战篇.实际上我已经把源码发布到了 ...

  4. ionic2/cordova自定义插件集成aar包

    一.准备自定义插件 1. 准备:安装plugman npm install -g plugman 2. 新建组件 plugman create --name MyPlugin --plugin_id ...

  5. PhoneGap(Cordova)通过插件读取android配置信息

    本文的场景是,通过phonegap编写的程序中,使用jsonp与服务端通信.而程序自动更新是通过java代码与服务端通信.从而导致了服务端的地址在js中维护了一份,在android的string.xm ...

  6. Cordova自定义插件

    项目原因需要自定义Cordova插件,下面把实现过程记录以便将来查阅. 工程为Eclipse下的Android工程,该工程已经引入Cordova.Cordova版本4.0.2. 1.定义插件类Open ...

  7. geoserver自定义插件_GIS篇 GeoServer个人笔记

    1.1WMS 1.1.1WMS地图服务(OpenGIS Web Map Service),将地图数据发布为WEB服务,提供网络地图图片. 1.1.2WMTS,访问已经切成瓦片分层的数据 1.2WFS要 ...

  8. vue+axios+qs序列化 “三步解析”【含demo实例】- 代码篇

    文章目录 qs序列化:是什么?为什么?怎么办?`实例截图参考` 一.`(简单了解)` · `三步解析 ` 序列化是一种用来处理对象流的机制: 对象.文件.数据,有许多不同的格式,很难统一传输和保存 序 ...

  9. 用Kotlin撸一个图片压缩插件-插件基础篇(二)

    简述: 前两天写了篇用Kotlin撸一个图片压缩插件-导学篇,现在迎来了插件基础篇,没错这篇文章就是教你如何一步一步从零开始写一个插件,包括插件项目构建,运行,调试到最后的上线发布整个流程.如果你是插 ...

最新文章

  1. 10-MySQL-Ubuntu-数据表中数据的查询(三)
  2. union-find算法分析(2)
  3. php sodium 加密解密,sodium库(加密)
  4. spring cloud eureka 服务之间调用_Spring-cloud微服务实战【一】:微服务的概念与演进过程...
  5. 解决在Python中使用Win32api报错的问题,No module named win32api
  6. 三十岁以前不必在乎的29件事
  7. java算程序运行时间_关于计算Java程序运行时间
  8. el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...
  9. python内置的数据结构_Python内置数据结构
  10. POI Excel 合并数据相同的行
  11. .net Core 在 CentOS7下,报The type initializer for 'Gdip' threw an exception.异常
  12. 不用代码趣讲 ZooKeeper 集群
  13. 2014-10-18 多玩初面
  14. 太励志!北大物业小哥六战法考终上岸
  15. C语言课题1:猜数字游戏【从基础开始手把手教你】
  16. 如何恢复移动硬盘数据删除的文件
  17. 后版权时代,网易云用IPO开启进击之路
  18. 大众点评网平台架构组高级工程师 hadoop 应用案例
  19. C++实现推箱子小游戏(源代码)
  20. ns-3.29在Ubuntu系统的安装

热门文章

  1. 写给准备秋招的学弟学妹们
  2. 微信小程序简单小代码
  3. 熊市量缩,衍生品交易所Hopex决定深耕永续合约
  4. arduino米思齐驱动彩灯条
  5. 河南师范大学计算机研究生投档线,2020河南师范大学研究生分数线汇总(含2018-2019历年复试)...
  6. python镜像站点
  7. 浏览器主页被修改最简单直接方法
  8. Hutool导出Excel,在一个单元格设置多个字体样式
  9. 拆装微型计算机的心得体会,微机课程设计心得
  10. 视频分割、分类、行为标注工具