相关链接
WXApiDelegate
WXApiDelegate代理方法:接收并处理来自微信终端的事件和消息,期间微信界面会切换到第三方应用程序
WXApiDelegate会在handleOpenURL:delegate:中使用并触发
两种代理方法
-(void) onReq:(BaseReq*)req;
在这方方法中收到微信请求,异步处理完成后必须调用sendResp发送处理结果给微信可能收到 GetMessageFromWXReq 、ShowMessageFromWXReq等
/**
在这方方法中收到微信请求,异步处理完成后必须调用sendResp发送处理结果给微信,可能收到 GetMessageFromWXReq 、ShowMessageFromWXReq等
*/
-(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];
[alert release];
}
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, msg.thumbData.length];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
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];
[alert release];
} else if ([req isKindOfClass:[PayReq class]]) {
NSLog(@"hehe");
}
}
-(void) onResp:(BaseResp*)resp;
收到一个来自微信的处理结果。调用一次sendReq会收到onResp,可能收到的结果为SendMessageToWXResp 、SendAuthResp
-(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];
[alert release];
}
支付过程
- (void)sendPay;
发送请求并从服务器得到相应的数据,如果获取的数据不为空,则将数据传给PayReq进行+(BOOL) sendReq:(BaseReq*)req;处理
/**
发送请求并从服务器得到相应的数据,如果获取的数据不为空,则将数据传给PayReq进行+(BOOL) sendReq:(BaseReq*)req;处理
*/
- (void)sendPay
{
//从服务器获取支付参数,服务端自定义处理逻辑和格式
//订单标题
NSString *ORDER_NAME = @"Ios服务器端签名支付 测试";
//订单金额,单位(元)
NSString *ORDER_PRICE = @"0.01";
//根据服务器端编码确定是否转码
NSStringEncoding enc;
//if UTF8编码
//enc = NSUTF8StringEncoding;
//if GBK编码
enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *urlString = [NSString stringWithFormat:@"%@?plat=ios&order_no=%@&product_name=%@&order_price=%@",
SP_URL,
[[NSString stringWithFormat:@"%ld",time(0)] stringByAddingPercentEscapesUsingEncoding:enc],
[ORDER_NAME stringByAddingPercentEscapesUsingEncoding:enc],
ORDER_PRICE];
//解析服务端返回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]autorelease];
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(@"日志输出 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:@"服务器返回错误"];
}
}
+(BOOL) sendReq:(BaseReq*)req;
作用:发送请求到微信,等待微信返回onResp。函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp.微信在异步处理完成后一定会调用onResp。支持一下类型:SendAuthReq 、SendMessageToWXReq 、PayReq等。