美文网首页
ios 集成微信app支付(只有付款)

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

作者: 一个纠结的人 | 来源:发表于2017-04-26 10:16 被阅读72次

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

一 , 扯淡
先说一下为啥要写这个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时, 校验页面

相关文章

网友评论

      本文标题:ios 集成微信app支付(只有付款)

      本文链接:https://www.haomeiwen.com/subject/bgpvzttx.html