文档章节

iOS--微信支付

指尖流年
 指尖流年
发布于 2017/07/11 14:54
字数 642
阅读 61
收藏 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
博文 62
码字总数 33037
作品 0
海淀
iOS工程师
私信 提问
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
微信支付在Android和IOS上表现不一致 怎么破!

做过微信支付的都应该知道上面的一个JS支付API吧 我就不废话了 上面PHP输出的是一个json对象,里面包含订单信息什么的。 问题是如果是PHP直接输出的,在安卓和ios都没问题,但是如果是ajax传...

duandi
2014/07/21
12K
10
安卓、ios APP调用微信支付时,页面出现空白 。(php微信支付,app发起微信支付白屏)?

安卓、ios APP调用微信支付时,页面出现空白 我的后端是用php开发的。我是先调用微信的统一下单生成,生成prepay_id预支付订单号,代码如下: config['money'])*100; ?> 将生成的下面这几个参...

zhf4512148
2016/07/28
1K
3
电商平台App(可支持大部分通用行业,可定制开发特殊需求)

http://downloadpkg.apicloud.com/app/download?path=http://7xw89y.com1.z0.glb.clouddn.com/a3bfaebae85c8d9c074d52bd4834fe0_d本平台支持手机App(Android和IOS),支持微信公众号(暂不支......

Q317075064
2016/10/08
2
0
最新手游联运系统,IOS切充值SDK,免去苹果30%分成

新版ios联运系统,第三方支付切换智能跳过苹果支付,直接收款,免苹果分成 专业化账户体系,简化ios上包流程 后台智能化控制,防检测,易操作。 http://dadmin.efzpay.com 演示账号demo 密码...

广州宜分账
2017/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Sound Programmer Guide

Introductory Material Preface For Whom This Guide Is Intended What this Guide Describes For More Information Chapter: 1 Introduction to the Java Sound API Design Goals Who is th......

祖冲之
3分钟前
0
0
HTTP协议状态码304和200区别

当浏览器第一次加载资源的时候,返回一般为200,意思是成功获取资源,并会在浏览器的缓存中记录下max-age; 当第二次访问的时候:如果只是用浏览器打开,那么浏览器会去判断这个资源在缓存里...

晚风0623
3分钟前
0
0
阿里云物联网平台体验(树莓派+Python篇)

虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作。但是同时也见证了阿里云物联网团队从几十人到数百人的迅速...

阿里云云栖社区
16分钟前
0
0
java单例设计模式

实现方法一 package com.hs.pattern.singleton;/** * 优点:实现简单 * 缺点:线程不安全 * 例如:当两个线程都运行到if( singleton == null ),而singleton确实为空,则两个线程都...

yangyangyyyy
21分钟前
1
0
MacOS下安装MongoDB数据库

官方链接:Install MongoDB Community Edition on macOS 推荐大家使用Homebrew安装 ##1.更新 Homebrew’s 包版本 brew update 2.安装MongoDB brew install mongodb 休息片刻,等他安装完就...

凌宇之蓝
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部