iOS微信支付简单粗暴篇

啥也不说了,直接进主题:
首先去这个网页 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN 下载微信支付需要的SDK,倒入进自己的工程中。

微信支付SDK.png

添加依赖库:


A9362E87-CD04-4DD0-9947-6D72A3F88662.png

修改两配置:


3BE0696E-C53B-4BB0-ACC6-F594A0F49D23.png
5B7F4099-89C9-4EF1-85A0-BF836476F8C6.png

这里需要在info里面配置两个东西,一个白名单一个就是http请求网络允许

B9BBAEF1-5757-46EA-A813-8A24876C990F.png

OK,开始敲代码:
在AppDelegate.h里面:


8B83AD9F-5AD6-41BC-8D4A-2F82013FA6C2.png

在AppDelegate.m中写下面的代码:

   #import "AppDelegate.h"
   #import "WXApiManager.h"
   // 微信开放平台申请得到的 appid, 需要同时添加在 URL schema
   NSString * const WXAppId = @"wxd930ea5d5a258f4f";
   @interface AppDelegate ()
   @end
   @implementation AppDelegate
   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
       [WXApi registerApp:WXAppId];
       return YES;
   }
   #pragma mark - 微信支付回调
   - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
   {
       return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
   }
   - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
   {
       return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
   }
   // NOTE: 9.0以后使用新API接口
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
   {
       return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
   }

Demo整体这么多file注意对应:


4BAD73D2-194E-4260-A7AA-BF5150197A90.png

下面是WXApiManager.h

   #import <Foundation/Foundation.h>
   #import "WXApi.h"

   @interface WXApiManager : NSObject<WXApiDelegate>

   + (instancetype)sharedManager;

   @end

WXApiManager.m文件:

   #import "WXApiManager.h"
   @implementation WXApiManager
   #pragma mark - 单例
   +(instancetype)sharedManager {
       static dispatch_once_t onceToken;
       static WXApiManager *instance;
       dispatch_once(&onceToken, ^{
           instance = [[WXApiManager alloc] init];
       });
       return instance;
   }

   #pragma mark - WXApiDelegate

   - (void)onResp:(BaseResp *)resp
   {
if([resp isKindOfClass:[PayResp class]]){
    
    //支付返回结果,实际支付结果需要去微信服务器端查询
    NSString *strMsg;

    switch (resp.errCode) {
        case WXSuccess:
            strMsg = @"支付结果:成功!";
            NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
            break;
            
        default:
            strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
            NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
            break;
           }
       }
   }
   @end

在ViewController.m文件中写上以下的代码就搞定了:

   #import "ViewController.h"
   #import "WXApi.h"

   @interface ViewController ()

   @end

   @implementation ViewController

   - (void)viewDidLoad {
       [super viewDidLoad];
   //    [self bizPay];
   }
   //模拟
   - (IBAction)wxPayClick:(id)sender {
       [self easyPay];
   }

   //模拟支付订单
   - (void)easyPay{
   //    NSDictionary *dict = @{@"appid":@"wx75b78ead0e64a547",@"attach":@"支付测试",@"body":@"APP支付测试",@"mch_id":@"10000100",@"nonce_str":@"1add1a30ac87aa2db72f57a2375d8fec",@"notify_url":@"http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php",@"out_trade_no":@"1415659990",@"spbill_create_ip":@"14.23.150.211",@"total_fee":@"0.1",@"trade_type":@"APP",@"sign":@"0CB01533B8C1EF103065174F50BCA001"};
   //    NSMutableString *stamp  = [dict objectForKey:@"timestamp"];

//调起微信支付
PayReq* req             = [[PayReq alloc] init];
req.partnerId           = @"1900000109";
req.prepayId            = @"WX1217752501201407033233368018";
req.nonceStr            = @"5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
req.timeStamp           = 1412000000;
req.package             = @"Sign=WXPay";
req.sign                = @"9A0A8659F005D6984697E2CA0A9CF3B7";
[WXApi sendReq:req];
   }
   //真实生成订单走这个方法
   - (void)bizPay {
       NSString *res = [self jumpToBizPay];
       if( ![@"" isEqual:res] ){
           UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失败" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alter show];
}

   }
   -(NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程实现
// 注意:参数配置请查看服务器端Demo
// 更新时间:2015年11月20日
//============================================================
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 @"服务器返回错误";
   }
 }
 - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
  }
 @end

基本上到这里,你的应用跳转微信支付是没有问题的了,我们移动端做的事情就这么多的,剩下的抛给后台弄吧,如果他不会,就说他菜,别傻傻的把支付生成订单这么牛逼的事情放在我们移动端,会出问题的。切记切记!
GitHub下载地址

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

推荐阅读更多精彩内容