文档章节

iOS--微信支付

指尖流年
 指尖流年
发布于 2017/07/11 14:54
字数 642
阅读 58
收藏 1

不多说,直接上代码

一.集成微信

1 使用Cocopods 导入SDK,pod 'WechatOpenSDK'

2.设置URL Scheme,APPID,如图

3.在info里配置http网络请求和微信白名单,如图

二.项目代码

在AppDelegate.m里面:头文件#import "WXApi.h"//微信授权,遵守协议WXApiDelegate,注册微信

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

[WXApi registerApp:UIWeiXin_APPKEY];

}

//微信回调

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

{

//友盟分享    

BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];

    if (result == FALSE) {

        //调用其他SDK,例如支付宝SDK等

            //微信支付

               [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];

               return YES;

    }

    return result;

}



// 这个方法是用于从微信返回第三方App

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

{

    return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];

}

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options

{

    return [self handleOpenURL:url];

}



-(BOOL) handleOpenURL:(NSURL *)url

{

   //微信

    if([url.description hasPrefix:UIWeiXin_APPKEY]){

        return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];

     }else{

      //友盟

        return [[UMSocialManager defaultManager] handleOpenURL:url];

    }

}

//微信回调

- (void)onResp:(BaseResp *)resp {

    // 向微信请求授权后,得到响应结果----微信登录,可忽略

    if ([resp isKindOfClass:[SendAuthResp class]]) {

           SendAuthResp *temp = (SendAuthResp *)resp;  

        if((resp.errCode == 0)){//确认授权时调用

        [self getWXUserInfo:temp.code WithBaseRespErrorCode:resp.errCode];

          }else{        }

    }else if ([resp isKindOfClass:[PayResp class]]){//微信支付

            //启动微信支付的response

        NSString *payResoult = [NSString stringWithFormat:@"errcode:%d", resp.errCode];

        //支付返回结果,实际支付结果需要去微信服务器端查询

        switch (resp.errCode) {

            case 0:

                payResoult = @"支付结果:成功!";

                break;

            case -1:

                payResoult = @"支付结果:失败!";

                break;

            case -2:

                payResoult = @"用户已经退出支付!";

                break;

            default:

          payResoult = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];

            break;

        }

    }

}

在Controller中

-(void)pay:(UIButton *)sender

{

  [[HTTPRequest sharedInstance] GET:url parameters:param succeed:^(id responseObject) {

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

            if([dict[@"code"] isEqualToString:@"200"]){

            //微信支付调用

                [self WXWithDict:dict];       

           }

        } failure:^(NSError *error) {

            NSLog(@"error:%@",error);

              }];

}

-(void)WXWithDict:(NSDictionary *)dict

{    //需要创建这个支付对象

    PayReq *req   = [[PayReq alloc] init];

    // 商家id,在注册的时候给的

    req.partnerId = dict[@"partnerid"];

     // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你

    req.prepayId  = dict[@"prepayid"];

     // 根据财付通文档填写的数据和签名

    //这个比较特殊,是固定的,只能是即req.package = Sign=WXPay

    req.package  = dict[@"package"];

       // 随机编码,为了防止重复的,在后台生成

    req.nonceStr  = dict[@"noncestr"];

       // 这个是时间戳,也是在后台生成的,为了验证支付的

    NSString * stamp = dict[@"timestamp"];

    req.timeStamp = stamp.intValue;

       // 这个签名也是后台做的

    req.sign = dict[@"sign"];

    NSLog(@"req--partnerId:%@,prepayId:%@,package:%@,nonceStr:%@,timeStamp:%d,sign:%@",req.partnerId,req.prepayId,req.package,req.nonceStr,req.timeStamp,req.sign);

    

    //发送请求到微信,等待微信返回onResp

    [WXApi sendReq:req];

}

注:后台返回的dict 中字段必须小写,如图

 

© 著作权归作者所有

共有 人打赏支持
指尖流年
粉丝 9
博文 57
码字总数 26355
作品 0
海淀
iOS工程师
国外移动支付市场预测:苹果三星谷歌占统治地位

国外移动支付市场预测:苹果三星谷歌占统治地位 2018-07-31 11:33编辑: garace分类:业界动态来源:新浪科技 谷歌支付三星苹果 招聘信息: iOS开发 iOS开发 iOS开发 app开发上架H5技术 app开...

garace
07/31
0
0
微信开放平台开发工具包(SDK)

iOS开发工具包 开发工具包(SDK) 使用微信分享、登录、收藏、支付等功能需要的库以及文件。点击下载iOS开发工具包64位 使用微信语音识别接口、语音合成接口。点击下载 语音SDK+Demo+开发文档...

雪深
2015/02/05
0
0
苹果与微信“短兵相接” “神仙打架”不能让用户买单

苹果与微信此次“短兵相接”,更多反映出两大巨头关于游戏规则的一场“暗战”。即便如此,也绝不能将绑架用户利益、通过随意更改产品功能,作为自己占领高地的“撒手锏”。无论苹果还是微信,...

六库科技
06/08
0
0
如果坑请深坑之ionic微信开发

第一个是网上很多网友提出的问题:就是安卓机上微信里面无法播放视频的问题,而ios里面却不存在; 这个就要责怪一下傻逼微信了,微信里面调用的浏览器内核是QQ浏览器X5内核,我们在点击自己的...

武文海
2015/07/22
0
0
iOS与JS交互之UIWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「UIWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部