博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信支付SDK集成
阅读量:6413 次
发布时间:2019-06-23

本文共 6143 字,大约阅读时间需要 20 分钟。

   拖了很久的微信支付,记下来就是为了以后再用的时候不用很晕。自己感觉微信支付相对于支付宝简单多了。也有可能是先做的支付宝支付所以遇到的困难多,之后熟悉流程就简单了。直接了当来---

   SDK集成流程都一样:

     

  (1)SDK下载、导入,framework框架导入:

      SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1   

      在Target —> BuildPhases —> Link Binary With Libraries 路径下导入需要的库:

      

    • SystemConfiguration.framework
    • libz.tbd
    • libsqlite3.0.tbd
    • CoreTelephony.framework
    • QuartzCore.framework

 

  (2)设置白名单、回调URL Scheme(target--info里面,两个都有了,这里的是假的,不能暴露信息!)

 

   (3)完成项目中代码的实现。

       1.在APPDelegate.m文件中。完成以下方法中代码的迁移。

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

      - (BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url;

      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

      (下面的方法中,有我的支付宝支付的代码,前边已经写了支付宝支付!就没有删,懂就行了!银联支付的已经删了--)

       

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     //appkey(这里是假的)    [WXApi registerApp:@"wx5d64383823d57a11" withDescription:@"demo 2.0"];    return YES;}- (BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url{    return [WXApi handleOpenURL:url delegate:self];}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {        if ([url.host isEqualToString:@"safepay"]) {        // 支付跳转支付宝钱包进行支付,处理支付结果        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {                    }];                // 授权跳转支付宝钱包进行支付,处理支付结果        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {                        // 解析 auth code            NSString *result = resultDic[@"result"];            NSString *authCode = nil;            if (result.length>0) {                NSArray *resultArr = [result componentsSeparatedByString:@"&"];                for (NSString *subResult in resultArr) {                    if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {                        authCode = [subResult substringFromIndex:10];                        break;                    }                }            }            NSLog(@"授权结果 authCode = %@", authCode?:@"");        }];                return [WXApi handleOpenURL:url delegate:self];    }        return YES;}

    

    2.在APPDelegate.m中。处理微信的回调,这里边就是支付的结果。(微信很多功能都是通过onResp这个方法回调结果,可以好好看看WXApiObject.h这个文件,里面注释写得挺清楚的)

    

-(void)onResp:(BaseResp*)resp{    if ([resp isKindOfClass:[PayResp class]]){        PayResp*response=(PayResp*)resp;        switch(response.errCode){            case WXSuccess:                //服务器端查询支付通知或查询API返回的结果再提示成功                LOG(@"支付成功");                break;            default:                LOG(@"支付失败,retcode=%d",resp.errCode);                break;        }    }}

 

  (4)当我们支付的时候,微信需要我们的商品信息。跟支付宝支付一样,需要的MD5加密、签名操作都要在服务器做,我们只需要跟服务器交互拿到要传的参数就好了。(涉及到钱,关键信息一定一定在不能放在客户端中!!!)

    这里把支付封装到一个单例类中,直接调用就好了。(这里已经跟服务器对接好,请求到了订单信息)

    

- (void)wxPrepay:(int)payid charge:(float)paymoney{    [NetworkingHelper Networking:NetworkingTypePay param:^(NSMutableDictionary *parames) {        [parames setObject:@(1) forKey:@"pcid"];        [parames setObject:@(paymoney) forKey:@"paymoney"];        [parames setObject:[BWUser currentUser].channelid forKey:@"userID"];        [parames setObject:@(payid) forKey:@"payid"];    } completion:^(NSError *error, id obj) {        if ([[obj objectForKey:@"result"] intValue] == 0) {            NSDictionary* prepayInfo = [obj objectForKey:@"info"];            NSDate * datenow = [NSDate date];            NSString* timestam = [NSString stringWithFormat:@"%u",(unsigned int)[datenow timeIntervalSince1970]];            NSDictionary* dic = @{                                  //随机码                                  @"noncestr":[prepayInfo objectForKey:@"nonce_str"],                                  //预下单编号                                  @"prepayid":[prepayInfo objectForKey:@"prepay_id"],                                  //密钥                                  @"key":[prepayInfo objectForKey:@"key"],                                  //商铺号                                  @"partnerid":[prepayInfo objectForKey:@"mch_id"],                                  //appid                                  @"appid":[prepayInfo objectForKey:@"appid"],                                  //时间戳                                  @"timestamp":timestam,                                  //                                  @"package":@"Sign=WXPay"                                  };            dispatch_async(dispatch_get_main_queue(), ^{                [self wxPay:dic];            });                    }    }];}- (BOOL)wxPay:(NSDictionary*)payParams{    NSString * temp = [self sortetWithKey:payParams];    PayReq *request = [[PayReq alloc] init];    request.partnerId = [payParams objectForKey:@"partnerid"];    request.prepayId= [payParams objectForKey:@"prepayid"];    request.package = [payParams objectForKey:@"package"];    request.nonceStr= [payParams objectForKey:@"noncestr"];    request.timeStamp = [[payParams objectForKey:@"timestamp"] intValue];    request.sign= [[temp MD5HexEncode] uppercaseString];        return [WXApi sendReq:request];}- (NSString*)sortetWithKey:(NSDictionary*)params{    NSMutableString* paramStr = [[NSMutableString alloc] init];    NSArray* keys = [params allKeys];        //按字母顺序排序    NSArray* sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {        return [obj1 compare:obj2 options:NSNumericSearch];    }];        for(NSString* categoryId in sortedArray)    {        if (![categoryId isEqualToString:@"key"]) {            [paramStr appendFormat:@"%@=%@&", categoryId, [params objectForKey:categoryId]];        }            }        [paramStr appendFormat:@"key=%@", [params objectForKey:@"key"]];        return paramStr;}

  

  到这里就算完成了,最后处理一下支付成功、失败就可以了。

 

    

转载于:https://www.cnblogs.com/yeschenbaby/p/6632466.html

你可能感兴趣的文章
app包中的fragment和v4包中的fragment的使用的区别
查看>>
Http协议与缓存
查看>>
监测超过特定内存阀值进程并结束
查看>>
Linux Centos 查询信息
查看>>
android adb命令
查看>>
python “双”稀疏矩阵转换为最小联通量“单”矩阵
查看>>
揭秘天猫双11背后:20万商家600万张海报,背后只有一个鹿班
查看>>
重置mysq root密码脚本
查看>>
我的友情链接
查看>>
MHA配置参数
查看>>
深入理解Lock
查看>>
vim的块选择
查看>>
HTML --块
查看>>
在DLL中获取主进程窗口句柄
查看>>
基于消息队列的双向通信
查看>>
一个不错的loading效果
查看>>
Debian允许root用户登录
查看>>
linux的文件系统
查看>>
上云利器,K8S应用编排设计器之快到极致
查看>>
袋鼠云服务案例系列 | 从DB2到MySQL,某传统金融平台的互联网转型之路
查看>>