iOS 集成微信支付

技术分享

微信支付用到的文件

1.首先支持非arc 

 技术分享

 2.设置URL types

 技术分享

3.AppDelegate

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [WXApi registerApp:@”wxd930ea5d5a258f4f” withDescription:@”demo 2.0″];

    return YES;

}

 4.微信回调

复制代码
//处理微信通过URL启动App时传递的数据

– (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    

    return [WXApi handleOpenURL:url delegate:self];

}

//微信回调

– (void)onResp:(BaseResp *)resp {

    //errCode

    switch (resp.errCode) {

        case WXSuccess:

            //成功回调

            break;

        default:

            break;

    }

}

复制代码

 5.调用微信支付(主要代码,后台签名)

复制代码
  //调起微信支付

            PayReq* req = [[PayReq alloc] init];

            req.openID      = APPI_ID;

            req.partnerId   = PARTNER_ID;

            req.prepayId    = prePayid;

            req.nonceStr    = nonce_str;

            req.timeStamp   = now;

            req.package     = package;

            req.sign        = sign;

            [WXApi safeSendReq:req];
复制代码

 6.如果要在程序签名

 

复制代码
//

//  ViewController.m

//  WxPay

//

//  Created by apple on 15/6/9.

//  Copyright (c) 2015年 tqh. All rights reserved.

//

#import “ViewController.h”

#import “payRequsestHandler.h”

#import “WXApi.h”

@interface ViewController () {

    enum WXScene _scene;

    NSString *Token;

    long token_time;

}

@end

@implementation ViewController

– (instancetype)init

{

    self = [super init];

    if (self) {

        _scene = WXSceneSession;

    }

    token_time = 0;

    return self;

}

– (void)viewDidLoad {

    [super viewDidLoad];

    //向微信注册

    

    

    //微信支付

    UIButton *but2 = [[UIButton alloc]initWithFrame:CGRectMake(200, 100, 100, 40)];

    [but2 setTitle:@”微信支付” forState:UIControlStateNormal];

    but2.backgroundColor = [UIColor lightGrayColor];

    [but2 addTarget:self action:@selector(wxpay) forControlEvents:UIControlEventTouchUpInside];

    [but2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

    [self.view addSubview:but2];

    

}

//微信支付

– (void)wxpay

{

    //商户号

    NSString *PARTNER_ID    = @”1900000109″;

    //商户密钥

    NSString *PARTNER_KEY   = @”8934e7d15453e97507ef794cf7b0519d”;

    //APPID

    NSString *APPI_ID       = @”wxd930ea5d5a258f4f”;

    //appsecret

    NSString *APP_SECRET    = @”db426a9829e4b49a0dcac7b4162da6b6″;

    //支付密钥

    NSString *APP_KEY       = @”L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K”;

    

    //支付结果回调页面

    NSString *NOTIFY_URL    = @”http://localhost/pay/wx/notify_url.asp”;

    //订单标题

    NSString *ORDER_NAME    = @”Ios客户端签名支付 测试”;

    //订单金额,单位(分)

    NSString *ORDER_PRICE   = @”1″;

    

    //创建支付签名对象

    payRequsestHandler *req = [payRequsestHandler alloc];

    //初始化支付签名对象

    [req init:APPI_ID app_secret:APP_SECRET partner_key:PARTNER_KEY app_key:APP_KEY];

    

    //判断Token过期时间,10分钟内不重复获取,测试帐号多个使用,可能造成其他地方获取后不能用,需要即时获取

    time_t  now;

    time(&now);

    //if ( (now – token_time) > 0 )//非测试帐号调试请启用该条件判断

    {

        //获取Token

        Token                   = [req GetToken];

        //设置Token有效期为10分钟

        token_time              = now + 600;

        //日志输出

        NSLog(@”获取Token: %@\n”,[req getDebugifo]);

    }

    if ( Token != nil){

        //================================

        //预付单参数订单设置

        //================================

        NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];

        [packageParams setObject: @”WX”                                             forKey:@”bank_type”];

        [packageParams setObject: ORDER_NAME                                        forKey:@”body”];

        [packageParams setObject: @”1″                                              forKey:@”fee_type”];

        [packageParams setObject: @”UTF-8″                                          forKey:@”input_charset”];

        [packageParams setObject: NOTIFY_URL                                        forKey:@”notify_url”];

        [packageParams setObject: [NSString stringWithFormat:@”%ld”,time(0)]        forKey:@”out_trade_no”];

        [packageParams setObject: PARTNER_ID                                        forKey:@”partner”];

        [packageParams setObject: @”196.168.1.1″                                    forKey:@”spbill_create_ip”];

        [packageParams setObject: ORDER_PRICE                                       forKey:@”total_fee”];

        

        NSString    *package, *time_stamp, *nonce_str, *traceid;

        //获取package包

        package        = [req genPackage:packageParams];

        

        //输出debug info

        NSString *debug     = [req getDebugifo];

        NSLog(@”gen package: %@\n”,package);

        NSLog(@”生成package: %@\n”,debug);

        

        //设置支付参数

        time_stamp  = [NSString stringWithFormat:@”%ld”, now];

        nonce_str    = [TenpayUtil md5:time_stamp];

        traceid        = @”mytestid_001″;

        NSMutableDictionary *prePayParams = [NSMutableDictionary dictionary];

        [prePayParams setObject: APPI_ID                                            forKey:@”appid”];

        [prePayParams setObject: APP_KEY                                            forKey:@”appkey”];

        [prePayParams setObject: nonce_str                                          forKey:@”noncestr”];

        [prePayParams setObject: package                                            forKey:@”package”];

        [prePayParams setObject: time_stamp                                         forKey:@”timestamp”];

        [prePayParams setObject: traceid                                            forKey:@”traceid”];

        

        //生成支付签名

        NSString    *sign;

        sign        = [req createSHA1Sign:prePayParams];

        //增加非参与签名的额外参数

        [prePayParams setObject: @”sha1″                                            forKey:@”sign_method”];

        [prePayParams setObject: sign                                               forKey:@”app_signature”];

        

        //获取prepayId

        NSString *prePayid;

        prePayid            = [req sendPrepay:prePayParams];

        //输出debug info

        debug               = [req getDebugifo];

        NSLog(@”提交预付单: %@\n”,debug);

        

        if ( prePayid != nil) {

            //重新按提交格式组包,微信客户端5.0.3以前版本只支持package=Sign=***格式,须考虑升级后支持携带package具体参数的情况

            //package       = [NSString stringWithFormat:@”Sign=%@”,package];

            package         = @”Sign=WXPay”;

            //签名参数列表

            NSMutableDictionary *signParams = [NSMutableDictionary dictionary];

            [signParams setObject: APPI_ID                                          forKey:@”appid”];

            [signParams setObject: APP_KEY                                          forKey:@”appkey”];

            [signParams setObject: nonce_str                                        forKey:@”noncestr”];

            [signParams setObject: package                                          forKey:@”package”];

            [signParams setObject: PARTNER_ID                                       forKey:@”partnerid”];

            [signParams setObject: time_stamp                                       forKey:@”timestamp”];

            [signParams setObject: prePayid                                         forKey:@”prepayid”];

            

            //生成签名

            sign        = [req createSHA1Sign:signParams];

            

            //输出debug info

            debug     = [req getDebugifo];

            NSLog(@”调起支付签名: %@\n”,debug);

            

            //调起微信支付

            PayReq* req = [[PayReq alloc] init];

            req.openID      = APPI_ID;

            req.partnerId   = PARTNER_ID;

            req.prepayId    = prePayid;

            req.nonceStr    = nonce_str;

            req.timeStamp   = now;

            req.package     = package;

            req.sign        = sign;

            [WXApi safeSendReq:req];

        }else{

            /*long errcode = [req getLasterrCode];

             if ( errcode == 40001 )

             {//Token实效,重新获取

             Token                   = [req GetToken];

             token_time              = now + 600;

             NSLog(@”获取Token: %@\n”,[req getDebugifo]);

             };*/

            NSLog(@”获取prepayid失败\n”);

            [self alert:@”提示信息” msg:debug];

        }

    }else{

        NSLog(@”获取Token失败\n”);

        [self alert:@”提示信息” msg:@”获取Token失败”];

    }

    

}

//客户端提示信息

– (void)alert:(NSString *)title msg:(NSString *)msg

{

    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@”OK” otherButtonTitles:nil];

    

    [alter show];

}

//- (void)onReq:(BaseReq *)req {

//    NSLog(@”qwe123″);

//}

– (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

复制代码

 DEMO下载地址:http://pan.baidu.com/s/1jGjCaJc

 补:有些童鞋出现跳到微信支付又跳回来的情况一般是你集成了第三方分享功能需要进行一下判断

– (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

 上面方法里面进行是不是微信支付的判断

复制代码
 if ([url.host isEqualToString:@”pay”]) {

        [WXApi handleOpenURL:url delegate:self];

    }

    

    return YES;
复制代码