ios 集成微信app支付(只有付款)

目录: (没闲工夫看扯淡的第一部分, 可直接看第二和第三部分. 没有任何影响)
一, 写文档的初衷, 和遇到的一些问题 (包含扯淡)
二, 集成步骤 (主要是官方文档部分), 偷懒了很多页面, 你们自己根据流程点击
三, 实现代码 (不包含第二部分的配置)
四, 注意点 / 可能会遇到的问题
五, 参考文章

一 , 扯淡
先说一下为啥要写这个demo教程, 不是有官方文档吗?
因为官方文档真心不咋地!!!!! 更新不及时, 好多地方也不说清楚
官方demo也运行不了. 有问题了想找个客服问, 只能给技术人员发邮件, 发邮件!!!
微信支付技术支持的邮箱: wepayTS@tencent.com
我带着问题一堆问题问, 人家只会一两句: 你的key设置的有问题吧.
我真想呵呵. 问了两次, 还是没告诉我咋弄, 就说我key有问题.
最后我解决问题了, 也不是key的问题. 等着客服邮件给你解决, 真是浪费生命, 浪费时间.

二, 集成步骤

  1. 前提, 申请成开发者, 和商户.( 商户, 商户. ). 这个没啥坑. 按照文档一步步弄就行.
    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=&lang=zh_CN
    正式开始集成

  2. 如果项目之前没有集成过微信SDK, 那么跟着下面的文档集成一下.
    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417694084&token=&lang=zh_CN

  3. 如果及集成过, 检查一下这几个框架是否已经加入
    SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework

  4. 接着官方文档集成 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
    (需要看注意点 2)

三, 代码, 这只是.m文件, 商户信息啦, appid啦, key啦, 自己替换,
#import "WXApi.h"
#import "WXApiRequestHandler.h"
#import "WXApiManager.h"
#import "AFNetworking.h"
#import <CommonCrypto/CommonDigest.h>

@interface WXApiRequestHandler()
@property (nonatomic, strong) AFHTTPSessionManager *mgr;
@end

@implementation WXApiRequestHandler

- (AFHTTPSessionManager *)mgr {
if (_mgr == nil) {
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    _mgr = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@"http://xxxxxxxxx"] sessionConfiguration:config];
    _mgr.requestSerializer.timeoutInterval = 10;
    _mgr.responseSerializer = [AFJSONResponseSerializer serializer];
    _mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/x-json", @"text/plain",@"text/html", nil];
    //        _mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
}
return _mgr;
}


#pragma mark - 支付
-  (NSString *)jumpToBizPay {   
NSMutableDictionary *dictc = [NSMutableDictionary dictionary];
[self.mgr POST:@"xxxxxxr" parameters:dictc success:^(NSURLSessionDataTask *task, NSDictionary *dict) {
    NSLog(@"dict:%@", dict);
    // 这俩字典, 你们别搞混了 dict, 是服务器返回的,    dict2是处理过, 加了sign的字典
    // 就干了一件事, 生成sign
    NSMutableDictionary *dict2 = [self getSign:dict];
    
    // 我服务器传过来的时间戳, 谁生成都无所谓, 注意一定是只精确到秒, 是个10位的数字串
    NSMutableString *stamp  = [dict2 objectForKey:@"timestamp"];
    //调起微信支付
    PayReq* req             = [[PayReq alloc] init];
    req.nonceStr            = [dict2 objectForKey:@"noncestr"];// 随机字符串
    req.package             = @"Sign=WXPay"; // 微信说暂时写死
    req.partnerId           = [dict2 objectForKey:@"partnerid"];// 就是mch_id, 商户id
    req.prepayId            = [dict2 objectForKey:@"prepayid"];// 微信返回的
    req.timeStamp           = stamp.intValue;
    req.sign                = [dict2 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 );
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"失败了");
}];

return @"";
}
// 这段是为了组成sign签名所需的key, 微信的文档表述的, 让新手看不懂, 会傻一会儿, 
// 具体可以看 文章的"注意点5"
- (NSMutableDictionary *)getSign:(NSDictionary *)dict{
  NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
  [signParams setObject: @"wxd1111111111111"  forKey:@"appid"];
  [signParams setObject: @"1111111111"  forKey:@"partnerid"];
  [signParams setObject: dict[@"nonce_str"]    forKey:@"noncestr"];
  [signParams setObject: @"Sign=WXPay"      forKey:@"package"];
  [signParams setObject: dict[@"timestamp"]    forKey:@"timestamp"];
  [signParams setObject: dict[@"prepay_id"]     forKey:@"prepayid"];

//生成签名
NSString *sign  = [self createMd5Sign:signParams];

//添加签名
[signParams setObject: sign forKey:@"sign"];
return signParams;
}


#pragma mark -  获取签名
-(NSString *) createMd5Sign:(NSMutableDictionary*)dict
 {
  NSMutableString *contentString  =[NSMutableString string];
  NSArray *keys = [dict allKeys];
  //按字母顺序排序, 不要自己排序!!!!! 不要自己排序!!!!!
  NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
      return [obj1 compare:obj2 options:NSNumericSearch];
  }];
  //拼接字符串
  for (NSString *categoryId in sortedArray) {
    if (![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"key"])
    {
        [contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
    }
  }
  //添加key字段, 设置路径 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
  [contentString appendFormat:@"key=%@", @"xxxxxxxxxxxxxxxxxxxxxx"];
  //得到MD5 sign签名, 一定要转大写!!!!!! 一定要转大写!!!!!!
  NSString *md5Sign =[[self md5:contentString] uppercaseString];
  NSLog(@"md5:%@", md5Sign);

  return md5Sign;
}

// 这段微信没写
- (NSString *) md5:(NSString *) input {

  const char *cStr = [input UTF8String];
  unsigned char digest[CC_MD5_DIGEST_LENGTH];
  CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call

  NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

  for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
      [output appendFormat:@"%02x", digest[i]];

  return output;
}
@end

四, 注意点:

  1. 如果没有加入CFNetwork.framework, 项目随便编译不报错, 但是会运行会崩溃在
    [WXApi registerApp:@"wxd1111111111111" ]; 这句.

  2. 微信文档 注册APPID 那段代码已经不对了, 要写成上面"注意点1" 那样.
    [WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"]; // 错的
    包括微信支付的官方demo, 这句也是错的.

  3. 微信支付的官方demo, 里面的地址也不能用了, demo里面的微信SDK都不是最新的, 呵呵了

粘贴的图片17_4_25_下午4_26.png
  1. key的设置路径: 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
    不超过32位的字符串, , 需要自己生成, 并且设置到该路径
  2. sign签名key
    贴图所在页 : https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12
Paste_Image.png

五:

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

推荐阅读更多精彩内容