iOS集成微信支付

微信支付流程

官方说明

Paste_Image.png

https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5

环境设置

  1. 拖入我附件中的SDK(可以将我附件中的SDK替换为官方的, 只为你放心)

  2. 设置URL Schemes : 微信应用注册后的 : AppID


    Snip20151231_10.png
Snip20151231_11.png

3 . 需要导入的框架
libc++.tbd libz.tbd libsqlite3.0.tbd SystemConfiguration.framework CoreTelephony.framework

4 . 为了以防万一 : 备用

// 设置URLSchemes白名单
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>

//设置退回Http
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

AppDelegate中

#import "WXApi.h"

@interface AppDelegate ()<WXApiDelegate>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [WXApi registerApp:AppID 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
{
    return [WXApi handleOpenURL:url delegate:self];
}

// 并且将下面方法添加到上面设置的delegate中, 支付完成微信会回调代理的这个方法
- (void)onResp:(BaseResp*)resp{
    if ([resp isKindOfClass:[PayResp class]]){
        PayResp *response = (PayResp*)resp;
        switch(response.errCode){
            case WXSuccess:
                //服务器端查询支付通知或查询API返回的结果再提示成功
                NSLog(@"支付成功");
                break;
            default:
                NSLog(@"支付失败,retcode=%d",resp.errCode);
                break;
        }
    }
}

// 使用CCPay, 修改自己需要的即可

CCPay中封装的代码 主要流程

一. 预支付 : 发送商品信息到预支付地址获取prepay_id
  1. 收集预付单参数
参数 noncestr 与 orderno 都是随机生成的
    [orderParas setObject: CCAppID           forKey:@"appid"];       //开放平台appid
    [orderParas setObject: CCMchID           forKey:@"mch_id"];      //商户号
    [orderParas setObject: @"iPhone10X"        forKey:@"device_info"]; //支付设备号或门店号
    [orderParas setObject: noncestr          forKey:@"nonce_str"];   //随机串
    [orderParas setObject: @"APP"            forKey:@"trade_type"];  //支付类型,固定为APP
    [orderParas setObject: @"大宝SOD咪咪"        forKey:@"body"];        //订单描述,展示给用户
    [orderParas setObject: @"You_Custom"    forKey:@"notify_url"];  //支付结果异步通知
    [orderParas setObject: orderno           forKey:@"out_trade_no"];//商户订单号
    [orderParas setObject: [CCDevice deviceIPAdress]    forKey:@"spbill_create_ip"];//发起支付的机器ip
    [orderParas setObject: @"1"       forKey:@"total_fee"];       //订单金额,单位为分
  1. 通过上面的参数按照官方的要求生成XML格式的参数
    NSMutableString *reqPars = [NSMutableString string];

    //生成xml的package
    NSArray *keys = [paras allKeys];
    [reqPars appendString:@"<xml>\n"];
    for (NSString *categoryId in keys) {
        [reqPars appendFormat:@"<%@>%@</%@>\n", categoryId, [paras objectForKey:categoryId],categoryId];
    }
    
    //生成签名,并将签名添加到签名包中
    sign = [self createMd5Sign:paras];
    [reqPars appendFormat:@"<sign>%@</sign>\n</xml>", sign];

    return [NSString stringWithString:reqPars];
  1. 将该参数转换为Data数据,通过POST发出请求
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];
    //设置提交方式
    [request setHTTPMethod:method];
    //设置数据类型
    [request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
    //设置编码
    [request setValue:@"UTF-8" forHTTPHeaderField:@"charset"];
    //如果是POST
    [request setHTTPBody:[data dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSError *error;
    //将请求的url数据放到NSData对象中
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    return response;
  1. 解析响应的NSData数据, 获得prepayid
    dictionary =[NSMutableDictionary dictionary];
    contentString=[NSMutableString string];
    
    // XML解析实例
    xmlElements = [[NSMutableArray alloc] init];
    
    xmlParser = [[NSXMLParser alloc] initWithData:data];
    
    [xmlParser setDelegate:self];
    [xmlParser parse];

代理中得到数据, 获取 prepayid

二. 真正的支付 : 发送PayReq(官方类)请求
  1. 生成确认支付的参数
    //获取到prepayid后进行第二次签名
    
    //设置支付参数
    time_t now;
    time(&now);
    NSString *time_stamp  = [NSString stringWithFormat:@"%ld", now];
    NSString *nonce_str = [CCUtil stringMd5WithString:time_stamp];
    NSString *package     = @"Sign=WXPay";    // 官方要求
    
    // 第二次签名参数列表
    NSMutableDictionary *signParas = [NSMutableDictionary dictionary];
    [signParas setObject: CCAppID        forKey:@"appid"];
    [signParas setObject: nonce_str    forKey:@"noncestr"];
    [signParas setObject: package      forKey:@"package"];
    [signParas setObject: CCMchID        forKey:@"partnerid"];
    [signParas setObject: time_stamp   forKey:@"timestamp"];
    [signParas setObject: prepayID     forKey:@"prepayid"];
    //[signParams setObject: @"MD5"       forKey:@"signType"];
    
    // 生成签名
    NSString *sign  = [self createMd5Sign:signParas];
    
    // 添加签名
    [signParas setObject: sign         forKey:@"sign"];
    
    return signParas;
  1. 调用微信进行支付
    PayReq* req             = [[PayReq alloc] init];
    req.openID              = [paras objectForKey:@"appid"];
    req.partnerId           = [paras objectForKey:@"partnerid"];
    req.prepayId            = [paras objectForKey:@"prepayid"];
    req.nonceStr            = [paras objectForKey:@"noncestr"];
    req.timeStamp           = [[paras objectForKey:@"timestamp"] intValue];
    req.package             = [paras objectForKey:@"package"];
    req.sign                = [paras objectForKey:@"sign"];
    
    // 发起微信支付
    [WXApi sendReq:req];

代码

http://pan.baidu.com/s/1qXt463y

封装为传入参数 : 订单名与价格即可开始支付, 有自己的需求, 到.m中自行修改
/**
 *  通过微信支付
 *
 *  @param orderName 订单名
 *  @param price     价格
 */
+ (void)payWXWithOrderName:(NSString *)orderName price:(NSString *)price;

最后

上面流程为自己从头开始完成支付, 并不是说必须按照上面步骤. 这里不同公司可能如何处理方式会有差异.
例如: 第一步预支付验证可以后台实现, 前台只需要请求公司内部服务器, 内部服务器发送对应的预支付请求, 并且将返回的数据简析完成后返回给前台, 前台直接执行支付操作.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • 刚集成完微信支付,总结总结 1. 准备 微信平台分为微信公众平台和微信开放平台,公众平台是运营微信公众号的管理系统...
    yaqiong阅读 20,539评论 13 40
  • 1.支付流程图 2. 官方网站下载以下文件 3.Build Phases ---> Link Binary Wit...
    伦伦子_f7b3阅读 663评论 0 1
  • 首先需要理清楚流程: 用户使用APP客户端,选择商品下单。 商户客户端(就是你做的APP)将用户的商品数据传给商户...
    0fbf551ff6fb阅读 366评论 0 2
  • iOS集成微信支付-Swift版 微信支付在微信红包的推动发展势头越来越猛,甚至有超过支付宝的趋势,那么在App集...
    iyakexi阅读 8,006评论 3 12
  • 使用场景:商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户AP...
    艳晓阅读 779评论 0 1