phonegap(cordova) 自己定义插件代码篇(六)----android ,iOS 微信支付工具整合
还是那句话,在使用插件代码篇的时候,请先了解插件机制(如整合原生插件先阅读原生插件文档。非常重要。非常重要!非常重要!),如未了解,请先阅读入门篇。这里就专贴关键代码
必须先把官方sdk 依照要求一步一步的整到自己项目中。然后再来看此代码,这里是cordova 整合代码
如有不明确的。加群 38840127
(function (cordova) {
var define = cordova.define;
define("cordova/plugin/wxpay", function (require, exports, module) {
var argscheck = require('cordova/argscheck'),
exec = require('cordova/exec');
exports.pay = function (orderInfo, successCB, failCB) {
argscheck.checkArgs('AFF', 'wxpay.pay', arguments);
if (!orderInfo) {
failCB && failCB("请输入订单信息.");
} else {
exec(successCB, failCB, "WXPay", "pay", orderInfo);
}
};
});
cordova.addConstructor(function () {
if (!window.plugins) {
window.plugins = {};
}
console.log("将插件注入cordovaWXPay...");
window.plugins.wxpay = cordova.require("cordova/plugin/wxpay");
console.log("wxpay注入结果:" + typeof (window.plugins.wxpay));
});
})(cordova);
Android
public class WXPayPlugin extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {
String WXParnter_ID = args.getString(0);
// 预支付订单id
String prepay_id = args.getString(1);
// nonceStr
String nonceStr = args.getString(2);
String timestamp = args.getString(3);
// 程序签名
String wxAppSign = args.getString(4);
if ("pay".equals(action)) {
// Log.i("ourwxpay", prepay_id + ">>>" + ">>>" + nonceStr + ">>>"
// + ">>>" + wxAppSign+">>>"+timestamp+"WXParnter_ID"+WXParnter_ID+">>"+wxAppSign);
PayReq req = new PayReq();
req.appId = Constants.APP_ID;
req.partnerId = WXParnter_ID;
req.prepayId = prepay_id;
req.packageValue = "Sign=WXPay";
req.nonceStr = nonceStr;
req.timeStamp = timestamp;
// req.timeStamp = String.valueOf(genTimeStamp());
req.sign = wxAppSign;
// 调用支付
boolean re = Constants.api.sendReq(req);
Log.i("ourwxpay",re+"<<<");
callbackContext.success();
return true;
} else {
return false;
}
}
}
</pre><p></p><p></p><pre code_snippet_id="1551972" snippet_file_name="blog_20160108_4_9274250" name="code" class="java">public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Constants.api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
Constants.api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
String msg = "false";
if(resp.errCode==0){
msg = "true";
}
// 通知到页面 支付工具 0--微信 1--支付宝 2--银联
String jsCode = "pay.result('0','','" + msg + "')";
yooshow.instance.ToJS(jsCode);
}
}
}
iOS
#import <Cordova/CDV.h> @interface CDVWXPay : CDVPlugin
@property (nonatomic,copy) NSString*callbackID;
//Instance Method
-(void) pay:(CDVInvokedUrlCommand*)command ; @end
#import "CDVWXPay.h"
#import "Order.h"
#import "Conts.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>
#import "AppDelegate.h"
@implementation CDVWXPay
@synthesize callbackID;
-(void)pay:(CDVInvokedUrlCommand *)command
{ //合作者账号
NSString* WXPartnerID = [command.arguments objectAtIndex:0];
//预支付订单号
NSString* WXPrepayID = [command.arguments objectAtIndex:1];
//nonceStr
NSString* NonceStr = [command.arguments objectAtIndex:2];
//时间戳
NSString* Timestamp = [command.arguments objectAtIndex:3];
//appsign
NSString* AppSign = [command.arguments objectAtIndex:4]; PayReq* request = [[[PayReq alloc] init] autorelease];
request.partnerId = WXPartnerID;
request.prepayId = WXPrepayID;
request.package =@"Sign=WXPay";
request.nonceStr = NonceStr;
request.timeStamp = [Timestamp intValue];
request.sign = AppSign;
[WXApi sendReq:request]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@""];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@end
-(void) onResp:(BaseResp*)resp
{ if([resp isKindOfClass:[PayResp class]]){
NSString* msg = @"false";
switch (resp.errCode) {
case WXSuccess:
msg = @"true";
break; default: break;
}
NSString *js = [[NSString alloc]initWithFormat:@"pay.result('0','','%@')", msg ];
[[AppDelegate appDelegate] runJS:js];
} }
服务端相应 C# 版
/// <summary>
/// 微信签名(预支付订单生成)
/// </summary>
/// <param name="param"></param>
/// <returns></returns> public WXPrepayOrderEntity WXPaySign(WXPayParam param)
{
var config = AppService.Instance.GetThirdPartyConfig();
OrderInfo orderInfo = OrderService.Instance.GetList(o => o.OrderNO == param.OrderNO).FirstOrDefault();
WXPayPrepayParam prepayParam = new WXPayPrepayParam();
prepayParam.Body = orderInfo.Subject; // 32位内的随机串,防重发
prepayParam.Noncestr = Guid.NewGuid().ToString().Replace("-", "");
prepayParam.Out_Trade_NO = orderInfo.OrderNO;
prepayParam.ClientIP = "192.168.10.1";
prepayParam.Toatal_fee = (int)(orderInfo.TotalAmount * 100);//转换成分
prepayParam.WXTradeType = WXTradeTypeKind.APP.ToString();
//生成预支付订单号
string prepayId = PayService.Instance.GenWXPayPrepayid(prepayParam);
//再次签名
List<KeyValuePair<String, String>> paramList = new List<KeyValuePair<String, String>>();
paramList.Add(new KeyValuePair<string, string>("appid", config.WXOpenAppID));
paramList.Add(new KeyValuePair<string, string>("noncestr", prepayParam.Noncestr));
paramList.Add(new KeyValuePair<string, string>("package", "Sign=WXPay"));
paramList.Add(new KeyValuePair<string, string>("partnerid", config.WXPayPartner));
paramList.Add(new KeyValuePair<string, string>("prepayid", prepayId));
string timestamp = Convert.ToInt64(DateTime.Now.Subtract(Convert.ToDateTime("1970-01-01")).TotalSeconds).ToString();
paramList.Add(new KeyValuePair<string, string>("timestamp", timestamp));
string appSign = GenWXPayAppSign(paramList); WXPrepayOrderEntity result = new EntityModel.Pay.Entity.WXPrepayOrderEntity(); result.WXPrepayID = prepayId;
result.WXPartnerID = config.WXPayPartner;
result.WXNonceStr = prepayParam.Noncestr;
result.WXAppSign = appSign;
result.WXTimestamp = timestamp;
return result;
}
/// <summary>
/// 验证微信支付回调,假设通过则处理订单。并返回true ,假设验证失败则直接返回false
/// </summary>
/// <param name="wxNotifyString"></param>
/// <returns></returns>
public string WXPayNotifyVerify(string wxNotifyString)
{
var config = AppService.Instance.GetThirdPartyConfig(); //=======【基本信息设置】=====================================
/* 微信公众号信息配置
* APPID:绑定支付的APPID(必须配置)
* MCHID:商户号(必须配置)
* KEY:商户支付密钥。參考开户邮件设置(必须配置)
* APPSECRET:公众帐号secert(仅JSAPI支付的时候须要配置)
*/
WxPayConfig.APPID = config.WXOpenAppID;
WxPayConfig.MCHID = config.WXPayPartner;
WxPayConfig.KEY = config.WXPayPartner_Key;
WxPayConfig.APPSECRET = config.WXOpenAppSecret;
//=======【证书路径设置】=====================================
/* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时须要)
*/
WxPayConfig.SSLCERT_PATH = "cert/apiclient_cert.p12";
WxPayConfig.SSLCERT_PASSWORD = "";
//=======【支付结果通知url】=====================================
/* 支付结果通知回调url。用于商户接收支付结果
*/
WxPayConfig.NOTIFY_URL = config.WXPayServer_Notify;
//=======【商户系统后台机器IP】=====================================
/* 此參数可手动配置也可在程序中自己主动获取
*/
WxPayConfig.IP = "8.8.8.8"; //=======【代理server设置】===================================
/* 默认IP和port号分别为0.0.0.0和0。此时不开启代理(如有须要才设置)
*/
WxPayConfig.PROXY_URL = ""; //=======【上报信息配置】===================================
/* 測速上报等级。0.关闭上报; 1.仅错误时上报; 2.全量上报
*/
WxPayConfig.REPORT_LEVENL = 1; //=======【日志级别】===================================
/* 日志等级,0.不输出日志;1.仅仅输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
*/
WxPayConfig.LOG_LEVENL = 0; //转换数据格式并验证签名
WxPayData notifyData = new WxPayData();
try
{
notifyData.FromXml(wxNotifyString);
}
catch (WxPayException ex)
{
//若签名错误。则马上返回结果给微信支付后台
WxPayData res = new WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", ex.Message);
return res.ToXml(); } //检查支付结果中transaction_id是否存在
if (!notifyData.IsSet("transaction_id"))
{
//若transaction_id不存在。则马上返回结果给微信支付后台
WxPayData res = new WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", "支付结果中微信订单号不存在");
return res.ToXml(); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); //查询订单。推断订单真实性
if (!QueryOrder(transaction_id))
{
//若订单查询失败,则马上返回结果给微信支付后台
WxPayData res = new WxPayData();
res.SetValue("return_code", "FAIL");
res.SetValue("return_msg", "订单查询失败");
//Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
return res.ToXml();
}
//查询订单成功
else
{
//推断该笔订单是否在商户站点中已经做过处理
//假设没有做过处理。依据订单号(out_trade_no)在商户站点的订单系统中查到该笔订单的具体,并运行商户的业务程序
//假设有做过处理,不运行商户的业务程序 //注意:
//该种交易状态仅仅在两种情况下出现
//1、开通了普通即时到账,买家付款成功后。
//2、开通了高级即时到账。从该笔交易成功时间算起。过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。 //成功之后改动订单状态,记帐。加花
OrderPaySuccessParam param = new OrderPaySuccessParam();
//订单号
param.OrderNO = notifyData.GetValue("out_trade_no").ToString();
//支付宝交易号
param.TradeNO = transaction_id;
//支付方式
param.PayMethod = PaymentMethodKind.Online;
//卖家收款账户
param.Account = WxPayConfig.MCHID;
//卖家收款账户银行
param.Bank = PayTypeKind.WeiXin.ToString();
//买家账户
param.PayAccount = notifyData.GetValue("openid").ToString();
//买家收款账户银行
param.PayBank = notifyData.GetValue("bank_type").ToString();
//实际支付金额
param.TotalAmount = Convert.ToDouble(Convert.ToInt32(notifyData.GetValue("total_fee")) * 0.01);
//支付时间
param.PayDate = DateTime.ParseExact(notifyData.GetValue("time_end").ToString(), "yyyyMMddHHmmss", null);
//支付工具类型
param.PayType = PayTypeKind.WeiXin; OrderService.Instance.OrderPaySuccess(param); WxPayData res = new WxPayData();
res.SetValue("return_code", "SUCCESS");
res.SetValue("return_msg", "OK");
//Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
return res.ToXml();
}
}
//查询微信支付订单
private bool QueryOrder(string transaction_id)
{
WxPayData req = new WxPayData();
req.SetValue("transaction_id", transaction_id);
WxPayData res = WxPayApi.OrderQuery(req);
if (res.GetValue("return_code").ToString() == "SUCCESS" &&
res.GetValue("result_code").ToString() == "SUCCESS")
{
return true;
}
else
{
return false;
}
}
phonegap(cordova) 自己定义插件代码篇(六)----android ,iOS 微信支付工具整合的更多相关文章
- phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合
建议读者,先阅读官方文档,知晓其支付流程之后再来使用此代码,比方客户须要做什么,服务端须要做什么(非常重要!非常重要! 非常重要!),由于这几个篇幅都是纯代码篇,由于阅读前面的入门篇之后看这些应该毫无 ...
- phonegap(cordova) 自己定义插件代码篇(五)----android ,iOS 集成微信登陆
统一登陆还是非常有必要的,安全,放心.代码 /*cordov 微信自己定义插件*/ (function (cordova) { var define = cordova.define; define( ...
- phonegap(cordova) 自己定义插件代码篇(四)----读取本地图片
有时候确实知道本地图片地址,要获取到base64 /** * 获取本地图片,包括路径和压缩后的 base64 */ (function (cordova) { var define = cordov ...
- 开源代码分析之Android/iOS Hybrid JSBridge框架
Hybrid开发是现在的主流形式,对于业务快速迭代的公司尤其重要.曾将在鞋厂接触了很多关于Hybrid的理念,在这里分享一些Hybrid框架思想. Hybrid框架包括Native与H5的通信,Web ...
- Cordova开发总结(插件篇)
最近刚刚做完一个用Cordova开发了一款电子商务的应用.在选用Cordova前,我有考察过,国内的Appcan, Apicloud等等的解决方案.其实Appcan,ApiCloud的混合方案挺完整的 ...
- Android版微信小代码(转)
以下代码仅适用于Android版微信: //switchtabpos:让微信tab更贴合Android Design 如果你并不喜欢微信Android版和iOS端同用一套UI,现在有一个小方法可以实现 ...
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...
- Cordova应用的JavaScript代码和自定义插件代码的调试
我之前写过三篇Cordova相关的技术文章.当我们使用Cordova将自己开发的前端应用打包安装到手机上后,可能会遇到需要调试Cordova应用的时候. 本文就介绍Cordova应用的调试步骤. 如果 ...
- Android Cordova 插件开发之编写自己定义插件
前言 本文适合Android+web的复合型人才,由于cordova本身就是混合开发,所以在Android开发的基础上,还要懂web相关技术(HTML+CSS+JS).可是也有例外,比方我.仅仅需负责 ...
随机推荐
- 启用QNX系统,海尔智能冰箱或成业界“宝马”
智能家电正处于迅猛发展的态势,国内眼下有非常多企业都在积极布局智能家电,当中又以海尔最为典型.作为家电领域的领头羊,海尔近年来在智能家电领域的动作不小.近期有消息透露.海尔也许会在IFA展会上 ...
- jQuery插件 -- Cookie插件
Cookie是站点设计者放置在client的小文本文件.Cookie能为用户提供非常多的使得,比如购物站点存储用户以前浏览过的产品列表.或者门户站点记住用户喜欢选择浏览哪类新闻. 在用户同意的情况下. ...
- 2014.08.04,读书,读书笔记-《Matlab概率与数理统计分析》-第1章 MATLAB的数据基础
第1章 MATLAB数据基础 虽然一直间或使用MATLAB,但从来没有系统的学习过,现在开始也不晚.先对几个重点或者平时忽略的要点做下笔记. %后的所有文字为注释,多条命令可以放在一行,但要用逗号或分 ...
- HDU 5654 xiaoxin and his watermelon candy 离线树状数组
xiaoxin and his watermelon candy Problem Description During his six grade summer vacation, xiaoxin g ...
- angularjs1-2,作用域、代码压缩
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 英语发音规则---G字母
英语发音规则---G字母 一.总结 一句话总结: 1.G发[g]音? bag [bæg] n. 袋:猎获物 go [gəʊ] vi. 走:达到 garden ['gɑːd(ə)n] n. 花园 gla ...
- zzulioj--1858--单词翻转(模拟)
1858: 单词翻转 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 88 Solved: 35 SubmitStatusWeb Board Desc ...
- 存储概念解析:NAS与SAN的区别
目前存储网络技术领域中的两个主旋律是SAN(存储区域网络)和NAS(网络连接区域存储),两者都宣称是解决现代企业高容量数据存储需求的最佳选择. 正如在餐厅就餐时大厨不会为您传菜,跑堂不会为您烹制鲜橙烩 ...
- 杂项:ExtJS
ylbtech-杂项:ExtJS extjs是一种软件.自动生成行号,支持checkbox全选,动态选择显示哪些列,支持本地以及远程分页,可以对单元格按照自己的想法进行渲染,这些也算可以想到的功能. ...
- Api接口服务的设计和安全解决方案
这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 普通网站应 ...