美文网首页iOS开发学习iOS经验总结
iOS 微信支付和 Universal Link

iOS 微信支付和 Universal Link

作者: 15218502b6fe | 来源:发表于2021-09-09 17:32 被阅读0次

    准备工作:

    1.https服务器。

    2.在微信开放平台创建应用,申请支付功能,获取App ID。


    开始对接支付功能:

    第一步:安装sdk

    打开Xcode,通过Pod安装微信SDK:

    pod 'WechatOpenSDK'

    pod install

    第二步:项目配置

    2.1:配置 URL Types

    image

    2.2:info.plist 添加白名单,weixin、weixinULAPI

    image

    2.3:打开苹果开发者网站(http://developer.apple.com),勾选 Associated Domains。

    image

    2.4:Xcode中,在 Capability 中添加 Associated Domains,Domains:填写【applinks:域名】,如

    applinks:www.xxxx.com

    image

    第三步:配置 Universal Link(通用链接)

    创建空白文本,命名为apple-app-site-association(无后缀),

    内容如:

     {
        "applinks": {
            "apps": [],
            "details": [ 
                {
                    "appID": "2EX886S24H.com.ZXKJ.Maintenance",
                    "paths": ["/app/*"]
                }
            ]
        }
    }
    

    说明:appID填写格式: "TeamID.Bundle ID",“苹果账号团队ID.BundleID”

    文件交给后台程序员,上传至根目录或 .well-known 目录下。形成链接后,可下载即成功。

    https://cloud.xxxxxx.com/.well-known/apple-app-site-association



    ⚠️⚠️⚠️ Universal Links 配置举🌰

    假设域名为:https://www.mydomain.com

    1.微信开放平台设置为:

    https://www.mydomain.com/app/

    2.apple-app-site-association 配置文件:

    {
    "appID": "2EX886S24H.com.ZXKJ.Maintenance",
    "paths": ["/app/*"]
    }

    3.在 Xcode -> Targets -> Signing & Capability -> Associated Domains,Domains 填写:

    applinks:www.mydomain.com

    4.Xcode中代码配置为:

    [WXApi registerApp:@"App Id" universalLink:@"https://www.mydomain.com/app/"];



    第四步:微信支付代码

    AppDelegate.m 中导入头文件

    #import "WXApi.h"
    

    : - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中加入代码:

        //微信调试代码 
        /* 
        [WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) { 
            NSLog(@"WeChatSDK: %@", log); 
        }]; 
        */
    
        /* 微信 */ 
        BOOL success = [WXApi registerApp:WeChat_AppKey universalLink:WeChat_universalLink]; 
        if (success) { 
            NSLog(@"微信 registerApp success!"); 
        }
    
        //调用自检函数,调试代码 
        /* 
        [WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
            NSLog(@"WeChatSDK step = %@, %u, %@, %@ result=%@", @(step), result.success, result.errorInfo, result.suggestion, result);
        }];
        */
    

    👇不能少!否则无法调起微信

    #pragma mark - 设置系统回调
    
    // NOTE: 9.0以后使用新API接口 
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { 
        BOOL result_wechat = [WXTools handleOpenURL:url]; 
        if (result_wechat) { 
            return result_wechat; 
        } 
        return NO; 
    }
    
    // Universal Link(通用链接) 
    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { 
        BOOL result_wechat = [WXTools handleOpenUniversalLink:userActivity]; 
        if (result_wechat) { 
                return result_wechat; 
        }
        return NO;
    }
    

    微信支付工具类:

    WXPayTools.h

    #import <Foundation/Foundation.h>
    #import "WXApi.h"
    
    #define  WXTools [WXPayTools sharedInstance]
    
    #define  WeChat_AppKey @""
    
    @interface WXPayTools : NSObject
    + (WXPayTools *)sharedInstance;
    
    // 回调
    - (BOOL)handleOpenURL:(NSURL *)url;
    // 回调 Universal Link(通用链接)
    - (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity;
    
    /** wechat支付 */
    - (void)doWXPay:(NSDictionary *)reqDict paySuccess:(void (^)(void))paySuccessBlock payFailed:(void (^)(void))payFailedBlock;
    
    @end
    

    WXPayTool.m

    #import "WXPayTools.h"
    
    @interface WXPayTools ()<WXApiDelegate>
    @property (nonatomic, copy) void (^authSuccessBlock)(NSString *reqCode);
    @property (nonatomic, copy) void (^paySuccessBlock)(void);
    @property (nonatomic, copy) void (^payFailedBlock)(void);
    @end
    
    @implementation WXPayTools
    + (WXPayTools *)sharedInstance {
        static WXPayTools *instance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [WXPayTools new];
        });
        return instance;
    }
    
    // 回调
    - (BOOL)handleOpenURL:(NSURL *)url {
        if ([[url absoluteString] rangeOfString:[NSString stringWithFormat:@"%@://pay/", WeChat_AppKey]].location == 0) {
            return [WXApi handleOpenURL:url delegate:self];
        }
        return NO;
    }
    // 回调 Universal Link(通用链接)
    - (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity {
        return [WXApi handleOpenUniversalLink:userActivity delegate:self];
    }
    
    /** wechat支付 */
    - (void)doWXPay:(NSDictionary *)dataDict paySuccess:(void (^)(void))paySuccessBlock payFailed:(void (^)(void))payFailedBlock; {
        self.paySuccessBlock = paySuccessBlock;
        self.payFailedBlock = payFailedBlock;
    
        if ([dataDict isKindOfClass:[NSDictionary class]]) {
            PayReq *request = [[PayReq alloc] init];
            request.partnerId = dataDict[@"partnerId"];
            request.prepayId = dataDict[@"prepayId"];
            request.package  = @"Sign=WXPay";
            request.nonceStr = dataDict[@"nonceStr"];
            request.timeStamp = [dataDict[@"timeStamp"] intValue];
            request.sign = dataDict[@"sign"];
            [WXApi sendReq:request completion:^(BOOL success) {
                NSLog(@"success - %d", success);
            }];
        }
    }
    
    #pragma mark - Delegate回调方法
    - (void)onResp:(id)resp {
        if ([resp isKindOfClass:[PayResp class]]) {
            PayResp *response = (PayResp *)resp;
            switch(response.errCode) {
                case WXSuccess: {
                    NSLog(@"支付成功");
                    if (self.paySuccessBlock) {
                        self.paySuccessBlock();
                    }
                }  break;
    
                default: {
                    NSLog(@"支付失败");
                    if (self.payFailedBlock) {
                        self.payFailedBlock();
                    }
                } break; 
            } 
        } 
    } 
    @end
    

    支付页面调用工具类:

    - (void)wxPay {
        NSDictionary *data = @{
            @"appId"    : @"wx862e7a21b8df70b7",
            @"nonceStr" : @"li8tjxvshpxcmryefu8b87xftdf4ljnn",
            @"partnerId": @"1611925030",
            @"prepayId" : @"wx0913444284359740c9002e4995965f0000",
            @"sign"     : @"03359D5970F910EE5609E7BB4CA52DA8",
            @"timeStamp": @"1631166282"
        };
         
        [WXTools doWXPay:data paySuccess:^{
            NSLog(@"success!");
        } payFailed:^{
            NSLog(@"支付失败");
        }];
    }
    







    说明

    ⚠️⚠️⚠️ 全部配置完后,如果微信调用不起来,使用SDK 自检函数排查问题
    WeChatSDK step = 0, 1, check passed,
    WeChatSDK step = 1, 1, check passed,
    WeChatSDK step = 2, 1, check passed,
    WeChatSDK step = 3, 1, check passed,
    WeChatSDK step = 4, 1, check passed,
    WeChatSDK step = 5, 1, Universal Link check passed. The application is launched by WeChat via Universal Link,
    WeChatSDK step = 6, 1, All Check Passed!,

    step 6 走完,说明sdk接入和配置都没有问题。

    相关文章

      网友评论

        本文标题:iOS 微信支付和 Universal Link

        本文链接:https://www.haomeiwen.com/subject/kitwwltx.html