iOS集成微信支付

一泊窘、微信支付儡蔓,首先利用CocoaPods,導(dǎo)入微信支付SDK
pod 'WechatOpenSDK'
二搓蚪、 創(chuàng)建微信支付管理類(lèi) WechatManager
//  WechatManager.h
#import <Foundation/Foundation.h>
#import <WXApi.h>

@interface WechatManager : NSObject

+ (id)shareInstance;

+ (BOOL)handleOpenUrl:(NSURL *)url;

+ (void)hangleWechatPayWith:(PayReq *)req;

@end
// WechatManager.m
#import "WechatManager.h"

@interface WechatManager()<WXApiDelegate>

@end

@implementation WechatManager

+ (id)shareInstance {
    static WechatManager *weChatPayInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        weChatPayInstance = [[WechatManager alloc] init];
    });
    return weChatPayInstance;
}

+ (BOOL)handleOpenUrl:(NSURL *)url {
    return [WXApi handleOpenURL:url delegate:[WechatManager shareInstance]];
}

+ (void)hangleWechatPayWith:(PayReq *)req {
    [WXApi sendReq:req completion:^(BOOL success) {
        if (success) {
            NSLog(@"微信支付成功");
        } else {
             NSLog(@"微信支付異常");
        }
    }];
}

#pragma mark - 微信支付回調(diào)

- (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]) {
        /*
         enum  WXErrCode {
         WXSuccess           = 0,    < 成功
         WXErrCodeCommon     = -1,  < 普通錯(cuò)誤類(lèi)型
         WXErrCodeUserCancel = -2,   < 用戶點(diǎn)擊取消并返回
         WXErrCodeSentFail   = -3,   < 發(fā)送失敗
         WXErrCodeAuthDeny   = -4,   < 授權(quán)失敗
         WXErrCodeUnsupport  = -5,   < 微信不支持
         };
         */
        PayResp *response = (PayResp*)resp;
        switch (response.errCode) {
            case WXSuccess: {
                NSLog(@"微信回調(diào)支付成功");
                [[NSNotificationCenter defaultCenter] postNotificationName:UserNotificationAlipayOrWechatSuccess
                                                                    object:nil
                                                                  userInfo:nil];
            break;
            }
            case WXErrCodeCommon: {
                NSLog(@"微信回調(diào)支付異常");
                break;
            }
            case WXErrCodeUserCancel: {
                NSLog(@"微信回調(diào)用戶取消支付");
                break;
            }
            case WXErrCodeSentFail: {
                NSLog(@"微信回調(diào)發(fā)送支付信息失敗");
                break;
            }
            case WXErrCodeAuthDeny: {
                NSLog(@"微信回調(diào)授權(quán)失敗");
                break;
            }
            case WXErrCodeUnsupport: {
                NSLog(@"微信回調(diào)微信版本暫不支持");
                break;
            }
            default: {
                break;
            }
        }
    }
}
@end
三、在AppDelegate里面注冊(cè)APPKey
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
     LoginCodeViewController *mainViewController = [[LoginCodeViewController alloc] init];
        self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
    [self.window makeKeyAndVisible];
    // 微信支付注冊(cè)
    // WeiXinPayKey:APP在微信開(kāi)發(fā)者網(wǎng)站上申請(qǐng)的Key丁鹉。WeiXinLinks:微信開(kāi)發(fā)者Universal Link(這個(gè)有點(diǎn)麻煩妒潭,后面會(huì)詳細(xì)說(shuō)明,先把集成過(guò)程講完)揣钦。
    BOOL isSuccess = [WXApi registerApp:WeiXinPayKey universalLink:WeiXinLinks];
    if (isSuccess) {
        NSLog(@"微信支付API注冊(cè)成功");
    } else {
        NSLog(@"微信支付API注冊(cè)失敗");
    }    return YES;
}
四雳灾、補(bǔ)充說(shuō)明:WeiXinPayKey:APP在微信開(kāi)發(fā)者網(wǎng)站上申請(qǐng)的Key。WeiXinLinks:是微信開(kāi)發(fā)者的Universal Link(通用鏈接),
  1. 該鏈接一般為以https開(kāi)頭的公司域名冯凹;
  2. 開(kāi)發(fā)者中心配置谎亩,配置App ID支持Associated Domains:
配置開(kāi)發(fā)者中心支持Associated Domains.png
  1. Xcode工程配置
  • 在工程里 -Capabilities 里面打開(kāi)Associated Domains開(kāi)關(guān),配置內(nèi)容為以下格式:
applinks:www.baidu.com

Xcode配置.jpg
  • 在工程里 -Info 里面新建 LSApplicationQueriesSchemes數(shù)組,配置內(nèi)容為以下格式:
    LSApplicationQueriesSchemes.png
  1. 配置指定文件宇姚,這個(gè)文件名必須為apple-app-site-association匈庭,切記沒(méi)有后綴名,文件內(nèi)容如下:
{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "Xcode項(xiàng)目的Bundle Identifier",
                "paths": [ "*" ]
            }
        ]
    }
}
  1. 上傳上一步新建的文件到域名根目錄下:
  • 上傳該文件到你的域名所對(duì)應(yīng)的根目錄或者.well-known目錄下浑劳,這是為了蘋(píng)果能獲取到你上傳的文件阱持。
五、APPDelegate 處理支付SDK回調(diào)
#pragma mark - 微信支付配置返回 url處理方法

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([url.scheme containsString:WeiXinPayKey]) {
        if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://pay", WeiXinPayKey]]) {
            return [WechatManager handleOpenUrl:url];
        } else if ([url.absoluteString containsString:[NSString stringWithFormat:@"%@://oauth?", WeiXinPayKey]]) {
            return [WechatManager handleOpenUrl:url];
        }
    }
    return YES;
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
    NSURL *continueURL = userActivity.webpageURL;
    NSString *relativePath = continueURL.relativePath;
    if ([relativePath containsString:WeiXinPayKey] && [relativePath containsString:@"pay"]) {
        return [WXApi handleOpenUniversalLink:userActivity delegate:[WechatManager shareInstance]];
    } else if ([relativePath containsString:[NSString stringWithFormat:@"%@", WeiXinPayKey]]) {
        return [WXApi handleOpenUniversalLink:userActivity delegate:[WechatShareManager shareInstance]];
    }
    return YES;
}
六魔熏、URL-Types配置衷咽,這個(gè)schems就是微信開(kāi)發(fā)者平臺(tái)注冊(cè)的APPKey
URLType配置.jpg
七、調(diào)用支付接口,處理微信支付后處理通知
  1. 在支付界面控制器蒜绽,添加通知
- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(ailyPayOrWechatSuccessAction)
                                                 name:UserNotificationAlipayOrWechatSuccess
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(ailyPayOrWechatFailAction)
                                                 name:UserNotificationAlipayOrWechatFail
                                               object:nil];
}

  1. 書(shū)寫(xiě)支付結(jié)果通知回調(diào)方法镶骗, 然后對(duì)通知的函數(shù)進(jìn)行處理
#pragma mark - 利用通知處理支付結(jié)果

// 支付成功
- (void)ailyPayOrWechatSuccessAction {
    // 處理支付結(jié)果
    NSLog(@"處理支付成功結(jié)果");
}

// 支付失敗
- (void)ailyPayOrWechatFailAction {
    NSLog(@"處理支付失敗結(jié)果");

}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
  1. 創(chuàng)建訂單,創(chuàng)建成功后拿到后臺(tái)返回的信息躲雅,然后調(diào)用微信支付
#pragma mark - 確認(rèn)支付

- (void)userBuyGoodsAction {
    
    //  @param address_id 地址ID
    //  @param count 商品數(shù)量
    //  @param refer_id 商品ID
    //  @param refer_type 商品類(lèi)型 0課程 1直播
    //  @param type 支付類(lèi)型 0微信 1支付寶
    //  @param coupon_id 優(yōu)惠券ID
    //  @param handle 返回簽名
    
    int type = self.isWeixinPay ? 0 : 1;
    [HttpManager createOrderWithAddressId:self.locationModel.location_id count:@(1) refer_id:self.lessonModel.ID refer_type:@(0) type:@(type) coupon_id:nil andHandle:^(NSString *error, NSDictionary *result) {
        if (error == nil) {
           NSLog(@"微信支付創(chuàng)建訂單回執(zhí)-%@",result);
           NSDictionary *dict = [self jsonToDictionary:result[@"data"][@"data"]];
           PayReq *req   = [[PayReq alloc] init];
           req.nonceStr  = [dict objectForKey:@"noncestr"];
           req.timeStamp = [[dict objectForKey:@"timestamp"] intValue];
           req.package   = [dict objectForKey:@"package"];
           req.partnerId = [dict objectForKey:@"partnerid"];
           req.prepayId  = [dict objectForKey:@"prepayid"];
           req.sign      = [dict objectForKey:@"sign"];
           [WechatManager hangleWechatPayWith:req];
        } else {
            NSLog(@"訂單創(chuàng)建失敗,失敗原因-%@",result);
        }
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鼎姊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌此蜈,老刑警劉巖即横,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裆赵,居然都是意外死亡东囚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)战授,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)页藻,“玉大人,你說(shuō)我怎么就攤上這事植兰》菡剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵楣导,是天一觀的道長(zhǎng)废境。 經(jīng)常有香客問(wèn)我,道長(zhǎng)筒繁,這世上最難降的妖魔是什么噩凹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮毡咏,結(jié)果婚禮上驮宴,老公的妹妹穿的比我還像新娘。我一直安慰自己呕缭,他們只是感情好堵泽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恢总,像睡著了一般迎罗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上片仿,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天隘梨,我揣著相機(jī)與錄音刀诬,去河邊找鬼膘掰。 笑死倔约,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奸鸯。 我是一名探鬼主播咪笑,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娄涩!你這毒婦竟也來(lái)了窗怒?” 一聲冷哼從身側(cè)響起映跟,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扬虚,沒(méi)想到半個(gè)月后努隙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辜昵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年荸镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堪置。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躬存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舀锨,到底是詐尸還是另有隱情岭洲,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布坎匿,位于F島的核電站盾剩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏替蔬。R本人自食惡果不足惜告私,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望进栽。 院中可真熱鬧德挣,春花似錦恭垦、人聲如沸快毛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唠帝。三九已至,卻和暖如春玄柏,著一層夾襖步出監(jiān)牢的瞬間襟衰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工粪摘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瀑晒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓徘意,卻偏偏與公主長(zhǎng)得像苔悦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椎咧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 更新日期:20200522微信支付SDK 版本:1.8.6 iOS 接入指南 本文講解 iOS 接入微信SDK玖详,僅...
    獨(dú)木舟的木閱讀 1,972評(píng)論 0 5
  • 照著官網(wǎng)寫(xiě)好了 支付直接報(bào)敗,挫敗~~~ 先把官方demo下載下來(lái),可以本地倒入sdk蟋座,我是適用的pods拗踢,因?yàn)橹?..
    LYPC_下里巴人閱讀 400評(píng)論 0 1
  • iOS集成微信支付-Swift版 微信支付在微信紅包的推動(dòng)發(fā)展勢(shì)頭越來(lái)越猛,甚至有超過(guò)支付寶的趨勢(shì)向臀,那么在App集...
    iyakexi閱讀 8,121評(píng)論 3 12
  • 1. 去微信開(kāi)放平臺(tái)注冊(cè)app key ,獲取相應(yīng)的app key 創(chuàng)建應(yīng)用 2. 在工程中導(dǎo)入weixinsdk...
    Sugarwhi閱讀 544評(píng)論 0 0
  • 前言 最近做了一個(gè)項(xiàng)目, 又需要集成微信支付, 以前一直沒(méi)有記錄下來(lái), 這次在集成的過(guò)程中, 碰到了很多坑, 所以...
    wenjieli閱讀 456評(píng)論 0 0