還是那句話,在使用插件代碼篇的時候,請先了解插件機制(如整合原生插件先閱讀原生插件文檔,很重要!很重要!很重要!),如未了解,請先閱讀入門篇,這裏就專貼關鍵代碼
必須先把官方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";
//=======【代理服務器設置】===================================
/* 默認IP和端口號分別爲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;
}
}