宽容他人,放过自己。

微信支付demo分析

Posted on By anchoriteFili

相关链接


分析:


整个demo就是为了确认这笔订单是否成立,对所有的数据进行处理,接口中所有的参数经过排序、md5加密、拼接等一系列的操作后,进行第一次签名,以XML的方式发送到服务器,服务器处理后返回一个XML文件,文件经过处理将自己代码中的参数与服务器返回的参数进行比较,如果完全一致,则表示这笔订单可以接收了,对已经确认的各个参数进行第二次签名,发送到微信支付,进行支付过程。

支付环境的配置


1. iOS接入指南:

<1>搭建开发环境: 将SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件添加到你所建的工程中
<2>微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需 要在工程中链接上:
SystemConfiguration.framework
libz.dylib
libsqlite3.0.dylib
libc++.dylib
<3>在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添 加“URLscheme”为你所注册的应用程序id
<4>在你需要使 用微信终端API的文件中import WXApi.h 头文件,并增加 WXApiDelegate 协议。

2. 在代码中使用开发工具包

<1>要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id.
<2>重写AppDelegate的handleOpenURL和openURL方法
<3>现在,你的程序要实现和微信终端交互的具体请求与回应,因此需要实现WXApiDelegate协议的两个方法

配置环境:

1.将文件夹WXPayDemo直接拉入到程序中
2.在targates中选择info->URLTypes添加微信URLTypes

191410555662486.png

3.在Build Phases中添加所需的库
  • SystemConfiguration.framework
  • libz.dylib
  • libsqlite3.0.dylib
  • libc++.dylib

191414076751343.png

4.代码部分
appdelegate中
#import "WXApi.h" //引用头文件
,WXApiDelegate //添加代理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    [WXApi registerApp:@"wx427a2f57bc4456d1"]; //添加开发平台id
    
    return YES;
}

#pragma mark 重写这两个方法
- (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];
}

#pragma mark 实现两个代理方法
/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
 *
 * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
 * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
 * @param req 具体请求内容,是自动释放的
 */
- (void)onReq:(BaseReq *)req {
    
    if([req isKindOfClass:[GetMessageFromWXReq class]])
    {
        // 微信请求App提供内容, 需要app提供内容后使用sendRsp返回
        NSString *strTitle = [NSString stringWithFormat:@"微信请求App提供内容"];
        NSString *strMsg = @"微信请求App提供内容,App要调用sendResp:GetMessageFromWXResp返回给微信";
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        alert.tag = 1000;
        [alert show];
    }
    else if([req isKindOfClass:[ShowMessageFromWXReq class]])
    {
        ShowMessageFromWXReq* temp = (ShowMessageFromWXReq*)req;
        WXMediaMessage *msg = temp.message;
        
        //显示微信传过来的内容
        WXAppExtendObject *obj = msg.mediaObject;
        
        NSString *strTitle = [NSString stringWithFormat:@"微信请求App显示内容"];
        NSString *strMsg = [NSString stringWithFormat:@"标题:%@ \n内容:%@ \n附带信息:%@ \n缩略图:%lu bytes\n\n", msg.title, msg.description, obj.extInfo, (unsigned long)msg.thumbData.length];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    }
    else if([req isKindOfClass:[LaunchFromWXReq class]])
    {
        //从微信启动App
        NSString *strTitle = [NSString stringWithFormat:@"从微信启动"];
        NSString *strMsg = @"这是从微信启动的消息";
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    } else if ([req isKindOfClass:[PayReq class]]) {
        NSLog(@"调用支付请求");
    }
}

/*! @brief 发送一个sendReq后,收到微信的回应
 *
 * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
 * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
 * @param resp具体的回应内容,是自动释放的
 */
- (void)onResp:(BaseResp *)resp {
    
    NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
    NSString *strTitle;
    
    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 微信支付引用
#import "WXApiObject.h"
#import "WXApi.h"
#import "Encryption.h"
#import "WXPayDemo.h"

#pragma mark 将下面的内如复制粘贴到触发的方法中
    WXPayDemo *payDemo = [[WXPayDemo alloc] init]; //初始化demo,启用demo方法
    [payDemo setApp_id:APP_ID mach_id:MCH_ID andKey:PARTNER_ID]; //设置开发平台id、商户号和私钥
    NSMutableDictionary *dic = [payDemo payWithOrderName:@"微信支付测试" andOrderPrice:@"1"]; //提交商品描述和商品价格,价格单位为分,第二次签名信息
    
    if (dic == nil) {
        NSString *debug = [payDemo getDebugInfo]; //如果第二次签名失败,返回调试信息,进行调试
        [self alert:@"提示信息" msg:debug];
        
    } else {
        [self alert:@"确认" msg:@"下单成功,点击OK后调起支付"];
        
        //调起微信支付
        PayReq *req     = [[PayReq alloc] init];
        req.openID      = [dic objectForKey:@"appid"];
        req.partnerId   = [dic objectForKey:@"partnerid"];
        req.prepayId    = [dic objectForKey:@"prepayid"];
        req.nonceStr    = [dic objectForKey:@"noncestr"];
        req.timeStamp   = [[dic objectForKey:@"timestamp"] intValue];
        req.package     = [dic objectForKey:@"package"];
        req.sign        = [dic objectForKey:@"sign"];
        [WXApi sendReq:req];
        
    }

#pragma mark 警告窗口的弹出
- (void)alert:(NSString *)title msg:(NSString *)msg
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alter show];
}