相关链接
- wechat_sdk_sample_ios_payV3_加注释版.zip
- 微信支付demo:WXPayDemo.zip
- 微信支付例子测试例子:微信支付测试2.zip
- 微信支付网站PDF:微信支付.zip
分析:
整个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
3.在Build Phases中添加所需的库
- SystemConfiguration.framework
- libz.dylib
- libsqlite3.0.dylib
- libc++.dylib
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];
}