要想知道微信SDK是如何調(diào)起微信客戶端阱洪,那么咱們先看看微信SDK到底做了什么
前期準(zhǔn)備
- 接入前期準(zhǔn)備工作包括商戶簽約和密鑰配置,已完成商戶可略過吼旧。
- 下載微信SDK微信SDK下載地址
SDK集成流程
-
將解壓的微信OpenSDK文件夾拷貝到項目文件夾下,并導(dǎo)入開發(fā)環(huán)境中呻率。
libWeChatSDK.a
WechatAuthSDK.h
WXApi.h
WXApiObject.h
導(dǎo)入系統(tǒng)依賴庫
在link Binary With Libraries 里面添加
libc++.tbd
CoreTelephony.framework
libsqlite3.0.tbd
libz.tbd
SystemConfiguration.framework
還有之前導(dǎo)入的 libWeChatSDK.a
到這一步泊交,SDK集成已經(jīng)完畢
配置代碼
- 添加URL Schemes
點擊項目名稱,點擊“Info”選項卡,在“URL Types”選項中,點擊“+”, 在“URL Schemes”中輸入微信的注冊碼
- 在支付的類里引用頭文件:
#import "WXApi.h"
- 配置wxpay支付
#pragma mark ==============配置wxpay支付==============
- (void)payAction{
//發(fā)起網(wǎng)絡(luò)請求臭觉,去你們服務(wù)器請求1.訂單id,2. 錢(單位:分)辨液,3. 內(nèi)容描述
//訂單最好服務(wù)器生成虐急,本文為了各位看的明白,所以在本地生成滔迈!
[NetWorkTool dingiD:[self generateTradeNO] andDetail:@"描述" success:^(NSDictionary *responseObject) {
//服務(wù)器返回數(shù)據(jù)
//調(diào)起微信支付
PayReq* wxreq = [[PayReq alloc] init];
/** appid */
wxreq.openID = responseObject[@"result"][@"appid"];
/** 商家向財付通申請的商家id */
wxreq.partnerId = responseObject[@"result"][@"partnerid"];
/** 預(yù)支付訂單 */
wxreq.prepayId = responseObject[@"result"][@"prepayid"];
/** 隨機(jī)串止吁,防重發(fā) */
wxreq.nonceStr = responseObject[@"result"][@"noncestr"];
/** 時間戳,防重發(fā) */
wxreq.timeStamp = [responseObject[@"result"][@"timestamp"] intValue];
/** 商家根據(jù)財付通文檔填寫的數(shù)據(jù)和簽名 */
wxreq.package = responseObject[@"result"][@"package"];
/** 商家根據(jù)微信開放平臺文檔對數(shù)據(jù)做的簽名 */
wxreq.sign = responseObject[@"result"][@"sign"];
[WXApi sendReq:wxreq];
} failure:^(NSError *error) {
NSLog(@"%@",error);
}];
}
#pragma mark ==============產(chǎn)生隨機(jī)訂單號==============
- (NSString *)generateTradeNO
{
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
- 配置返回處理代碼
在 AppDelegate.h 文件中,增加微信協(xié)議:
#import "WXApi.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate,WXApiDelegate>
在 AppDelegate.m 文件中,增加引用代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化微信sdk
[WXApi registerApp:@"wx*********"];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
/*! @brief 處理微信通過URL啟動App時傳遞的數(shù)據(jù)
*
* 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中調(diào)用燎悍。
* @param url 微信啟動第三方應(yīng)用時傳遞過來的URL
* @param delegate WXApiDelegate對象敬惦,用來接收微信觸發(fā)的消息。
* @return 成功返回YES谈山,失敗返回NO俄删。
*/
return [WXApi handleOpenURL:url delegate:self];
}
- (void)onResp:(BaseResp *)resp
{
//支付返回結(jié)果,實際支付結(jié)果需要去微信服務(wù)器端查詢
NSString *strMsg = [NSString stringWithFormat:@"支付結(jié)果"];
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付結(jié)果:成功奏路!";
NSLog(@"支付成功-PaySuccess畴椰,retcode = %d", resp.errCode);
break;
default:
strMsg = [NSString stringWithFormat:@"支付結(jié)果:失敗思劳!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"錯誤迅矛,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
}
不用微信SDK 喚起微信支付
- 眾所周知,iOS是一個封閉的系統(tǒng)潜叛,應(yīng)用之間是不可以互相讀取文件的秽褒,蘋果就使用了URL Scheme來實現(xiàn)了這個功能壶硅。通過各個APP設(shè)計的符合蘋果的統(tǒng)一規(guī)范的URL Scheme,Url Scheme 是可以用來傳遞信息的
URL Scheme是為方便app之間互相調(diào)用而設(shè)計的销斟。你可以通過一個類似URL的鏈接庐椒,通過系統(tǒng)的OpenURl來打開該app,并可以傳遞一些參數(shù)蚂踊。每個URL必須能唯一標(biāo)識一個APP约谈,如果你設(shè)置的URL與別的APP的URL沖突,此時犁钟,你的APP不一定會被調(diào)用起來棱诱,原因是當(dāng)APP在安裝的時候就已經(jīng)在系統(tǒng)里面注冊了此APP的URL Scheme,如果你的一致但是是后安裝的涝动,那么系統(tǒng)不會調(diào)用你的APP迈勋,因為你的APP設(shè)置的URL scheme被覆蓋了。
- 分析得出醋粟,微信靡菇,支付寶等sdk 的分享,支付功能米愿,都是通過URL scheme 進(jìn)行傳遞內(nèi)容的
- 那么我們可以查看微信SDK喚起微信客服端支付的時候厦凤,傳遞的URL Scheme 是什么內(nèi)容,如果可以找到其編碼規(guī)律育苟,那么即可以不用sdk進(jìn)行支付
那么较鼓,發(fā)起支付的過程中,系統(tǒng)會喚起微信客戶端宙搬,我們思路是查看微信sdk發(fā)送給微信客戶端的URL Scheme內(nèi)容笨腥,就要偽造一個微信,也就是向系統(tǒng)聲明一個和微信URL Scheme相同的地址
查看微信URL Scheme地址
經(jīng)測試: 微信的URL Scheme是:weixin://
那么勇垛,我們新建個工程脖母,起名為:GetPayURLScheme
接著注冊自定義 URL Scheme
點擊 項目里info.plist (非test里面的info.plist)并選擇 右鍵 Open As – Source Code:
加入:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>weixin</string>
</array>
<key>CFBundleURLName</key>
<string>1111</string>
</dict>
</array>
這時候,點擊 項目里info.plist (非test里面的info.plist)并選擇 右鍵 Open As – list:
這樣就生成了如下圖的URLscheme:
在AppDelegate.m
里面添加
//應(yīng)用app接收urlScheme傳值時會響應(yīng)此方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
//顯示截取的urlscheme
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"接收到的urlScheme" message:url.absoluteString delegate:nil cancelButtonTitle:nil otherButtonTitles:@"確定", nil];
[alert show];
復(fù)制到剪貼板
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = url.absoluteString;
return YES;
}
運(yùn)行到手機(jī)里面闲孤,這時候谆级,你無論那個app要微信付款的時候,喚起的是剛才新建的名叫GetPayURLScheme工程 讼积,
如下圖:
可以看到:那個urlScheme:
weixin://app/wxdf261c3b90ffbc25/pay/?nonceStr=Ho7nAFOALQpVqSM7&package=Sign%3DWXPay&partnerId=1236537302&prepayId=wx201606052201506009de63980169148758&timeStamp=1465135310&sign=5A3EF234382FD61D36CEC104723387ED&signType=SHA1
可以看出:它的拼接方法是:
NSString *str = [NSString stringWithFormat:@"weixin://app/%@/pay/?nonceStr=%@&package=Sign%%3DWXPay&partnerId=%@&prepayId=%@&timeStamp=%@&sign=%@&signType=SHA1",appid,noncestr,partnerid,prepayid,[NSString stringWithFormat:@"%d",[timestamp intValue]],sign];
不用SDK肥照,只需要配置這么一段代碼,微信支付即可完成G谥凇S咭铩!C茄铡B蓝洹A源肌!努溃!
- (void)payAction{
//發(fā)起網(wǎng)絡(luò)請求硫嘶,去你們服務(wù)器請求1.訂單id,2. 錢(單位:分)梧税,3. 內(nèi)容描述
//訂單最好服務(wù)器生成沦疾,本文為了各位看的明白,所以在本地生成第队!
[NetWorkTool dingiD:[self generateTradeNO] andDetail:@"描述" success:^(NSDictionary *responseObject) {
/** appid */
NSString *appid = responseObject[@"result"][@"appid"];
/** 商家向財付通申請的商家id */
NSString *partnerId = responseObject[@"result"][@"partnerid"];
/** 預(yù)支付訂單 */
NSString *prepayId = responseObject[@"result"][@"prepayid"];
/** 隨機(jī)串哮塞,防重發(fā) */
NSString *nonceStr = responseObject[@"result"][@"noncestr"];
/** 時間戳,防重發(fā) */
NSString *timeStamp = responseObject[@"result"][@"timestamp"];
/** 商家根據(jù)財付通文檔填寫的數(shù)據(jù)和簽名 */
NSString *package = responseObject[@"result"][@"package"];
/** 商家根據(jù)微信開放平臺文檔對數(shù)據(jù)做的簽名 */
NSString *sign = responseObject[@"result"][@"sign"];
//生成URLscheme
NSString *str = [NSString stringWithFormat:@"weixin://app/%@/pay/?nonceStr=%@&package=Sign%%3DWXPay&partnerId=%@&prepayId=%@&timeStamp=%@&sign=%@&signType=SHA1",appid,nonceStr,partnerId,prepayId,[NSString stringWithFormat:@"%d",[timeStamp intValue] ],sign];
//通過openURL的方法喚起支付界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];
} failure:^(NSError *error) {
NSLog(@"%@",error);
}];
}
注意:
- 訂單最好服務(wù)器生成
- 之后必須去服務(wù)器驗證支付狀態(tài)3馄獭3固摇!
大功告成A乐!C呤骸L藿弧!改衩!
Demo 下載(轉(zhuǎn)載請注明出處a!)
- GetPayURLScheme
下載地址:點此下載
- WXPay
下載地址:點此下載