文档章节

ios微信支付

 鸡蛋炒青椒
发布于 2016/09/22 16:01
字数 1623
阅读 73
收藏 1

#一. ios微信支付集成:

###1.向微信注册你的应用程序id https://open.weixin.qq.com/cgi-bin/applist?t=manage/list&lang=zh_CN&token=51225de3bf080ed69d82e8d6e1487b1ef17a304e

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将获得AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。

###2.下载微信终端SDK文件:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN

SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。

下载SDK把这几个类拖到工程里面(如下图所示)。

###3.在你的工程文件中选择Build Setting,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h 三个文件所在位置(如下图所示)。 输入图片说明

###4.添加微信支付依赖库(如下图所示)。

输入图片说明

###5. 在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id(如下图所示)

输入图片说明

###6.下载微信终端SDK文件read_me.txt文件里微信跟新主意的地方。

重要!
SDK1.6.2
1、xCode7.1 构建的sdk包
2、请使用xCode7.1进行编译

SDK1.6.1
1、修复armv7s下,bitcode可能编译不过
2、解决warning

SDK1.6
1、iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。
受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2、开发者需要在工程中链接上 CoreTelephony.framework
3、解决bitcode编译不过问题

SDK1.5
1、废弃safeSendReq:接口,使用sendReq:即可。
2、新增+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id<WXApiDelegate>) delegate;
支持未安装微信情况下Auth,具体见WXApi.h接口描述
3、微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib。

#二.ios微信支付

下面是微信支付的流程。 输入图片说明

1.先在AppDelegate倒入头文件。

2.在AppDelegate.m填写你的微信APPID。

#import "WXApi.h"

[WXApi registerApp:@"wxe40fd2962d22b8f8" withDescription:@"demo 2.0"];

3.如果你的程序要发消息给微信,那么需要调用WXApi的sendReq函数。onReq是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用sendRsp返回。在调用sendRsp返回时,会切回到微信终端程序界面。:

需要注意的是,SendMessageToWXReq的scene成员,
如果scene填WXSceneSession,
那么消息会发送至微信的会话内。
如果scene填WXSceneTimeline,
那么消息会发送至朋友圈。
如果scene填WXSceneFavorite,那么消息会发送到“我的收藏”中。
scene默认值为WXSceneSession。

- (void)onResp:(BaseResp *)resp{
    
    if ([resp isKindOfClass:[PayResp class]]) {
        //返回支付结果,实际支付结果需要取微信服务端查询
        NSString *strMsg = @"支付结果";
        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付成功";
                break;
                
            default:
                strMsg = @"支付失败";
                break;
        }
        
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"%d",resp.errCode] message:resp.errStr preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *sure = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            
        }];
        [alertController addAction:sure];
        [self.window.rootViewController presentViewController:alertController animated:YES completion:^{
            
        }];
    }  
}

@brief 收到微信onReq的请求,发送对应的应答给微信,并切换到微信界面 *

  • 函数调用后,会切换到微信的界面。第三方应用程序收到微信onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有
  • GetMessageFromWXResp、ShowMessageFromWXResp等。
  • @param resp 具体的应答内容,调用函数后,请自己释放
  • @return 成功返回YES,失败返回NO。
-(void) onResp:(BaseResp*)resp

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

我们找到了Demo中完整的可以直接用的这部分发起微信支付的源码:

+ (NSString *)jumpToBizPay {

    if (![WXApi isWXAppInstalled]) {
        NSLog(@"该设备没有安装微信");
        return @"该设备没有安装微信";
    }
    
    if (![WXApi isWXAppSupportApi]) {
        NSLog(@"该设备不支持微信");
        return @"该设备不支持微信";
    }
    

// V3&V4支付流程实现
      // 注意:参数配置请查看服务器端Demo
      //============================================================
      NSString *urlString   = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
      //解析服务端返回json数据
     NSError *error;
     //加载一个NSURL对象
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
     //将请求的url数据放到NSData对象中
     NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
     if ( response != nil) {
         NSMutableDictionary *dict = NULL;
         //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
         dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
         
         NSLog(@"url:%@",urlString);
         if(dict != nil){
             NSMutableString *retcode = [dict objectForKey:@"retcode"];
             if (retcode.intValue == 0){
                 NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
                 
                 //调起微信支付
                 PayReq* req             = [[PayReq alloc] init];
                 req.partnerId           = [dict objectForKey:@"partnerid"];
                 req.prepayId            = [dict objectForKey:@"prepayid"];
                 req.nonceStr            = [dict objectForKey:@"noncestr"];
                 req.timeStamp           = stamp.intValue;
                 req.package             = [dict objectForKey:@"package"];
                 req.sign                = [dict objectForKey:@"sign"];
                 [WXApi sendReq:req];
                 //日志输出
                 NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
                 return @"";
             }else{
                 return [dict objectForKey:@"retmsg"];
             }
         }else{
             return @"服务器返回错误,未获取到json对象";
         }
     }else{
         return @"服务器返回错误";
        
            }
 }
//在点击方法里调用就好

当用户通过其他应用启动本应用时,会回调这个方法,url参数是其他应用调用openURL方法时传过来的。

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    // 处理微信通过URL启动App时传递的数据
    return [WXApi handleOpenURL:url delegate:self];
}

最后在说下调起微信支付 (如下图)。

这部分也是最重要的

输入图片说明

下面是官网Demo的解释。

@interface PayReq : BaseReq

/** 商家向财付通申请的商家id */
@property (nonatomic, retain) NSString *partnerId;
/** 预支付订单 */
@property (nonatomic, retain) NSString *prepayId;
/** 随机串,防重发 */
@property (nonatomic, retain) NSString *nonceStr;
/** 时间戳,防重发 */
@property (nonatomic, assign) UInt32 timeStamp;
/** 商家根据财付通文档填写的数据和签名 */
@property (nonatomic, retain) NSString *package;
/** 商家根据微信开放平台文档对数据做的签名 */
@property (nonatomic, retain) NSString *sign;

@end

/*! @brief 发送登录请求,等待WechatAuthAPIDelegate回调
 *
 * @param appId 微信开发者ID
 * @param nonceStr 一个随机的尽量不重复的字符串,用来使得每次的signature不同
 * @param timeStamp 时间戳
 * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔
 * @param signature 签名
 * @param schemeData 会在扫码后拼在scheme后
 * @return 成功返回YES,失败返回NO
    注:该实现只保证同时只有一个Auth在运行,Auth未完成或未Stop再次调用Auth接口时会返回NO。
 */

© 著作权归作者所有

上一篇: 核心动画
粉丝 2
博文 3
码字总数 3255
作品 0
成都
私信 提问
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
12.4K
10
安卓、ios APP调用微信支付时,页面出现空白 。(php微信支付,app发起微信支付白屏)?

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

zhf4512148
2016/07/28
2.2K
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
25
0
苹果与微信“短兵相接” “神仙打架”不能让用户买单

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

六库科技
2018/06/08
8
1

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部