微信支付现在是移动支付领域一支不可忽视的力量,我们移动开发人员在开发app的时候,也不可避免的用到各种支付,支付宝支付我们用的最多了,我这里就不讲解了,我现在给大家讲解一个iOS微信支付,首先 我们需要在微信开放平台注册商户信息(记住是微信开放平台不是公众平台),微信开放平台支持的银行卡有限,所以在确定用微信支付的时候先看看,支不支持公司的银行卡,比如广大银行卡是不支持的。

      在微信开放平台弄好app支付以后,下载iOS SDK,我们需要配置6个参数 如下图 它在微信支付SDK lib文件夹下的payRequestHandler.h文件中

ios能不能微信支付 苹果支持微信支付吗?_ios能不能微信支付

       把上面那几参数配置好,最下面那2个参数,如果服务器端没配置好可以先不修改,就用微信默认的参数就可以。

      因为微信支付的SDK代码是ARC的,所以我们需要在配置文件里面设置一下,添加-fno-objc-arc  如下图

   

ios能不能微信支付 苹果支持微信支付吗?_ios能不能微信支付_02

        我们还需要配置一下info里面的URL Types    , URL Schemes里面填写的是APP_ID的值

    

ios能不能微信支付 苹果支持微信支付吗?_微信支付_03

payRequsestHandler.h、WXApi.h   如下图

ios能不能微信支付 苹果支持微信支付吗?_提示信息_04

 我们在AppDelegate.m 实现文件中 写上相应的代码

 

//
//  AppDelegate.m
//  微信支付
//
//  Created by lairen on 15/8/18.
//  Copyright (c) 2015年 lairen. All rights reserved.
//

#import "AppDelegate.h"



//服务端签名只需要用到下面一个头文件
//#import "ApiXml.h"
#import <QuartzCore/QuartzCore.h>


@interface AppDelegate ()

@end

@implementation AppDelegate

@synthesize window = _window;

- (id)init{
    if(self = [super init]){
        _scene = WXSceneSession;
    }
    return self;
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 注册微信
    [WXApi registerApp:APP_ID withDescription:@"demo 2.0"];
    //添加通知
    [self addObserver];
    
    return YES;
}

#pragma mark 添加通知
-(void)addObserver
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sendPay_demo) name:@"weixinPay" object:nil];
}

-(void) changeScene:(NSInteger )scene
{
    _scene = (enum WXScene)scene;
}



-(void) onResp:(BaseResp*)resp
{
    NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
    NSString *strTitle;
    
    if([resp isKindOfClass:[SendMessageToWXResp class]])
    {
        strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
    }
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回结果,实际支付结果需要去微信服务器端查询
        strTitle = [NSString stringWithFormat:@"支付结果"];
        
        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;
        }
    }
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}


#pragma mark  微信支付  这个适合自己服务器交互调用的方法
- (void)sendPay
{
    //从服务器获取支付参数,服务端自定义处理逻辑和格式
    //订单标题
    NSString *ORDER_NAME    = @"ios 微信支付";
    //订单金额,单位(元)
    NSString *ORDER_PRICE   = @"0.01";
    
    //根据服务器端编码确定是否转码
    NSStringEncoding enc;
    //if UTF8编码
    //enc = NSUTF8StringEncoding;  SP_URL,
    //if GBK编码
    enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSString *urlString = [NSString stringWithFormat:@"?plat=ios&order_no=%@&product_name=%@&order_price=%@",
                           
                           [[NSString stringWithFormat:@"%ld",time(0)] stringByAddingPercentEscapesUsingEncoding:enc],
                           [ORDER_NAME stringByAddingPercentEscapesUsingEncoding:enc],
                           ORDER_PRICE];
    NSLog(@"%@",urlString);
    
    //解析服务端返回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:%@",dict);
        if(dict != nil){
            NSMutableString *retcode = [dict objectForKey:@"retcode"];
            if (retcode.intValue == 0){
                NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
                
                //调起微信支付
                PayReq* req             = [[PayReq alloc] init];
                req.openID              = [dict objectForKey:@"appid"];
                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(@"%@",req.openID);
                NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
            }else{
                [self alert:@"提示信息" msg:[dict objectForKey:@"retmsg"]];
            }
        }else{
            [self alert:@"提示信息" msg:@"服务器返回错误,未获取到json对象"];
        }
    }else{
        [self alert:@"提示信息" msg:@"服务器返回错误"];
    }
}

#pragma mark 微信测试支付  这个是调用的微信服务器的支付接口

- (void)sendPay_demo
{
    NSLog(@"微信支付 demo");

    //{{{
    //本实例只是演示签名过程, 请将该过程在商户服务器上实现
    
    //创建支付签名对象
    payRequsestHandler *req = [payRequsestHandler alloc];
    //初始化支付签名对象
    [req init:APP_ID mch_id:MCH_ID];
    //设置密钥
    [req setKey:PARTNER_ID];
    
    //}}}
    
    //获取到实际调起微信支付的参数后,在app端调起支付
    NSMutableDictionary *dict = [req sendPay_demo];
    
    if(dict == nil){
        //错误提示
        NSString *debug = [req getDebugifo];
        
        [self alert:@"提示信息" msg:debug];
        
        NSLog(@"%@\n\n",debug);
    }else{
        NSLog(@"%@\n\n",[req getDebugifo]);
        //[self alert:@"确认" msg:@"下单成功,点击OK后调起支付!"];
        
        NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
        
        //调起微信支付
        PayReq* req             = [[PayReq alloc] init];
        req.openID              = [dict objectForKey:@"appid"];
        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];
    }
}

//客户端提示信息
- (void)alert:(NSString *)title msg:(NSString *)msg
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alter show];

}

- (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];
}






@end



    我们再在ViewController文件中   添加支付按钮。直接在故事版上面拖上2个按钮就可以。第一个按钮是用的微信服务器返回的json数据 第二个按钮返回的是自己服务器返回的json数据,自己服务器返回的数据包括签名证书一些相关的东西,我们做操作演示  就使用微信的服务器


ios能不能微信支付 苹果支持微信支付吗?_微信支付_05

 

 给按钮加上点击方法。方法在ViewController.m文件中   点击方法的时候会发送一个通知给AppDelegate.m文件

#pragma mark 添加通知
-(void)addObserver
{
    [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(sendPay_demo)name:@"weixinPay"object:nil];
}



#import "ViewController.h"

@interface ViewController ()
- (IBAction)testPay:(id)sender;

- (IBAction)realPay:(id)sender;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


//微信支付测试签名
- (IBAction)testPay:(id)sender {
     [[NSNotificationCenter defaultCenter] postNotificationName:@"weixinPay" object:nil];
}

//微信支付测试签名
- (IBAction)realPay:(id)sender {
   UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"友情提示" message:@"服务器端接口还没开放,请稍后再试" delegate:nil cancelButtonTitle:@"好的" otherButtonTitles:nil, nil];
    [alert show];
}


@end

发送通知以后,在AppDelegate.h文件的监听方法会调用微信支付  如图

ios能不能微信支付 苹果支持微信支付吗?_ios_06

调用起微信支付后,就会打开微信  

ios能不能微信支付 苹果支持微信支付吗?_ios能不能微信支付_07


 ok,到这里我们的微信支付Demo,就已经做完了,同学们,加油啊。