- 微信支付要注意shareSDK里面微信是分为带支付不不带支付版本的微信,详情看shareSDK官方文档
向微信注册可写在didfinishedlunch方法里面
[WXApi registerApp:WeChat_AppID];//注册微信支付
- 支付流程可参照以下博客微信支付
- 防止链接失效,内容如下:
- 自己签名类型
//创建package签名
-(NSString*) createMd5Sign :(NSMutableDictionary*)dict
{
NSMutableString *contentString =[NSMutableString string];
NSArray *keys = [dict allKeys];
//按字母顺序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult( id obj1 , id obj 2) {
return [obj1 compare :obj2 options :NSNumericSearch];
}];
//拼接字符串
for (NSString *categoryId in sortedArray) {
if ( ![[dict objectForKey:categoryId] isEqualToString:@"" ]
&& ![categoryId isEqualToString :@"sign"]
&& ![categoryId isEqualToString :@"key"]
)
{
[contentString appendFormat :@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
}
}
//添加key字段
[contentString appendFormat :@"key=%@", self.spKey];
//得到MD5 sign签名
NSString *md5Sign =[contentString MD5];
return md5Sign;
}
- (NSMutableDictionary*)payWithprePayid:(NSString*)prePayid
{
if (prePayid == nil)
{
NSLog(@"prePayid 为空" );
return nil;
}
//获取到prepayid后进行第二次签名
NSString *package, *time_stamp, *nonce_str;
//设置支付参数
time_t now;
time(&now);
time_stamp = [NSString stringWithFormat :@"%ld", now];
nonce_str = [time_stamp MD5 ];
//重新按提交格式组包,微信客户端暂只支持package=Sign=WXPay格式,须考虑升级后支持携带package具体参数的情况
//package = [NSString stringWithFormat:@"Sign=%@",package];
package = @"Sign=WXPay" ;
//第二次签名参数列表
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
NSLog(@"%@" ,signParams);
[signParams setObject : self.appId forKey: @"appid"];
[signParams setObject : self.mchId forKey: @"partnerid"];
[signParams setObject : nonce_str forKey: @"noncestr"];
[signParams setObject : package forKey: @"package"];
[signParams setObject : time_stamp forKey: @"timestamp"];
[signParams setObject : prePayid forKey: @"prepayid"];
//生成签名
NSString *sign = [self createMd5Sign:signParams];
//添加签名
[signParams setObject : sign forKey :@"sign"];
//返回参数列表
return signParams;
}
- (BOOL )application:(UIApplication *)application handleOpenURL:(NSURL *)url {
// 跳转到URL scheme中配置的地址
//NSLog(@"跳转到URL scheme中配置的地址-->%@",url);
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager ]];
}
微信回调
- 可参照第三方登录时的回调代理方法,只是对应的类不一样
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"pay"]) {
// 处理微信的支付结果
[WXApi handleOpenURL:url delegate:self];
}
}
#pragma mark WXApiDelegate
-(void)onResp:(BaseResp *)resp{
MDLog(@"========%d%@",resp.errCode,resp.errStr);
if ([resp isKindOfClass:[SendAuthResp class]])//授权登录
{
SendAuthResp *rep = (SendAuthResp *)resp;
if (rep.errCode == 0)//成功
{
[[NSNotificationCenter defaultCenter]postNotificationName:@"WXAuthorizationSuccess" object:@{@"code":rep.code}];
}
}
if([resp isKindOfClass:[PayResp class]])
{
// 支付返回结果,实际支付结果需要去微信服务器端查询
strTitle = [NSString stringWithFormat:@"支付结果"];
switch (resp.errCode)
{
// retcode 0:支付成功 -1:支付失败 -2:用户取消
case WXSuccess:
strMsg = @"支付成功!";
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
[[NSNotificationCenter defaultCenter]postNotificationName:@"PaySuccess" object:nil];
break;
default:
if (resp.errCode == -2)
{
strMsg = @"用户取消";
}
else if(resp.errCode == -1)
{
strMsg = @"支付失败";
}
NSLog(@"支付结果:错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
}
- 然后在需要的页面监听支付回调,然后请求后台数据刷新页面
- (void)initView
{
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(paySuccess) name:@"PaySuccess" object:nil];
}
#pragma mark 付款成功之后刷新UI
- (void)paySuccess
{
NSMutableDictionary *dict = [NSMutableDictionary new];
[dict setObject:@"SSS" forKey:@"ctl"];
[dict setObject:@"SSSS" forKey:@"act"];
[self.httpsManager POSTWithParameters:dict SuccessBlock:^(NSDictionary *responseJson)
{
if (responseJson.success)
{
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
}
} FailureBlock:^(NSError *error)
{
}];
}