iOS不用微信SDK喚起微信支付

要想知道微信SDK是如何調(diào)起微信客戶端阱洪,那么咱們先看看微信SDK到底做了什么

前期準(zhǔn)備

  1. 接入前期準(zhǔn)備工作包括商戶簽約和密鑰配置,已完成商戶可略過吼旧。
  2. 下載微信SDK微信SDK下載地址

SDK集成流程

  1. 將解壓的微信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”中輸入微信的注冊碼
c1000
  • 在支付的類里引用頭文件:
#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 喚起微信支付

  1. 眾所周知,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被覆蓋了。

  1. 分析得出醋粟,微信靡菇,支付寶等sdk 的分享,支付功能米愿,都是通過URL scheme 進(jìn)行傳遞內(nèi)容的
  2. 那么我們可以查看微信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:

c1000

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

注意:

  1. 訂單最好服務(wù)器生成
  2. 之后必須去服務(wù)器驗證支付狀態(tài)3馄獭3固摇!

大功告成A乐!C呤骸L藿弧!改衩!

Demo 下載(轉(zhuǎn)載請注明出處a!)

  • GetPayURLScheme

下載地址:點此下載

  • WXPay

下載地址:點此下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葫督,隨后出現(xiàn)的幾起案子竭鞍,更是在濱河造成了極大的恐慌,老刑警劉巖橄镜,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偎快,死亡現(xiàn)場離奇詭異,居然都是意外死亡洽胶,警方通過查閱死者的電腦和手機(jī)晒夹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姊氓,“玉大人丐怯,你說我怎么就攤上這事∠韬幔” “怎么了读跷?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長禾唁。 經(jīng)常有香客問我效览,道長些膨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任钦铺,我火速辦了婚禮订雾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矛洞。我一直安慰自己洼哎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布沼本。 她就那樣靜靜地躺著噩峦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抽兆。 梳的紋絲不亂的頭發(fā)上识补,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音辫红,去河邊找鬼凭涂。 笑死,一個胖子當(dāng)著我的面吹牛贴妻,可吹牛的內(nèi)容都是我干的切油。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼名惩,長吁一口氣:“原來是場噩夢啊……” “哼澎胡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娩鹉,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤攻谁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弯予,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戚宦,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年熙涤,在試婚紗的時候發(fā)現(xiàn)自己被綠了阁苞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祠挫,死狀恐怖那槽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情等舔,我是刑警寧澤骚灸,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站慌植,受9級特大地震影響甚牲,放射性物質(zhì)發(fā)生泄漏义郑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一丈钙、第九天 我趴在偏房一處隱蔽的房頂上張望非驮。 院中可真熱鬧,春花似錦雏赦、人聲如沸劫笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽填大。三九已至,卻和暖如春俏橘,著一層夾襖步出監(jiān)牢的瞬間允华,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工寥掐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留靴寂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓曹仗,卻偏偏與公主長得像榨汤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怎茫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 實現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后妓灌,支付寶會提供一些必要的數(shù)據(jù)給我們 商戶...
    Anson楊春安閱讀 8,201評論 0 6
  • iOS支付 iOS支付分為兩類轨蛤,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)。 第三方支付包括:支付寶支付虫埂、微信支付祥山、銀聯(lián)支付、...
    sillen閱讀 1,368評論 0 1
  • iOS支付 iOS支付分為兩類掉伏,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)缝呕。 第三方支付包括:支付寶支付、微信支付斧散、銀聯(lián)支付供常、...
    帥不過oneS閱讀 2,885評論 2 8
  • 前言:本篇文章目的在于梳理知識,鞏固思想鸡捐,學(xué)習(xí)總結(jié)栈暇。有什么好的建議,都可以留言箍镜≡雌恚互相促進(jìn)煎源!總觀晤锥,微信支付豌汇,也沒心思...
    麥穗0615閱讀 10,041評論 8 70
  • 作 者 / 李夢雨 原創(chuàng)文章請勿非法轉(zhuǎn)載 去年開始,我注意到翡翠玉石這個行業(yè)访诱。注意是因為家人被不良商家騙了图张,幾十萬...
    李夢雨閱讀 470評論 0 0