ps:先来支付宝的。首先集成支付宝的SDK,这个真心是运气加上技术相结合才行~有时候一样的工程,就是给你报错~你能耐他何?然后第二天运行同样的工程,错误消失了~就是这么的神奇!详细的集成流程就不说了,简单大致提一下首先第一步要去与支付宝签约,获得商户ID也就是合作者身份,之后就开始下载官方文档与示例damo了,一步步按着官方文档来就行了.
PS:好了,运行之后就应该剩下一个报错了,这个报错有点麻烦,需要导入路径,让系统找到这个文件还是先把报错放出来吧
PS:下面是解决办法
PS:如果运行后openssl这个错误还是存在的话,那就不好意思了~重新导入吧~或者睡上一觉撸上一局吧~反正我是真切体会过的,晚上集成了几次都是剩下这个错,第二个重新运行,居然就可以了~就是真么的神奇。然后到获取以及上传公钥和私钥的问题了。
PS:然后是下载下来就是这个样子的
然后就搞定了啊~~由于现在网上的支付宝Demo都是在工程中签名加密的~所以这里我就不展示了~而且没用,现在的公司根本不会把签名加密放在工程当中了。所以我就以后台签名加密为例子。首先和后台商量如何给我返回数据,先上接口。
支付宝APP支付申请加签
调用接口(post)
www.401VN.com
请求参数
key (会员登录令牌)
pay_sn 支付编号
subject 订单主题描述信息
amount 订单金额
返回数据
resulr (参数字符串-加签之后的结果串)
apedcome
支付宝APP支付结果验签
调用接口(post)
www.401VN.com
请求参数
key (会员登录令牌)
alipay_resp 支付结果内的response数据串
resultStatus 结果状态码
sign_type 签名类型
sign 签名数据
返回数据
'1' 支付结果:成功
第一条接口是申请加签的接口,这条接口我们需要把订单的信息传给后台,让后台进行签名。然后给我们返回加签的结果。
首先这个第一条接口写在点击支付宝支付的那个按钮的点击方法哪里。
[NetWorkingpostWithUrlString:zhifubao_Signaparameters:prccsuccess:^(iddata) {
NSLog(@"网络请求成功");
[HUDhideAnimated:YES];
NSMutableDictionary* dict = [NSMutableDictionarydictionaryWithCapacity:10];
dict = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragments|NSJSONReadingMutableLeaveserror:nil];
NSLog(@"支付宝加签后返回的数据==%@",dict);
//NSLog(@"打断之后的数据=%@",arr);
if([dict[@"msg"]isEqualToString:@"1"]) {
//应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString*appScheme =@"alipay2016111902989697";
// NOTE:将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString*orderString = dict[@"datas"][@"retstr"];
// NOTE:调用支付结果开始支付
[[AlipaySDKdefaultService]payOrder:orderStringfromScheme:appSchemecallback:^(NSDictionary*resultDic) {
NSLog(@"支付宝回调后给我返回的数据源==%@",resultDic);
}];
}
}failure:^(NSError*error) {
NSLog(@"网络请求失败");
[HUDhideAnimated:YES];
}];
然后就是调用支付宝SDK的方法了。也就是下面的方法。
//该方法9.0以前的API接口
- (BOOL)application:(UIApplication*)application
openURL:(NSURL*)url
sourceApplication:(NSString*)sourceApplication
annotation:(id)annotation
{
if([url.hostisEqualToString:@"safepay"]) {
//支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary*resultDic) {
NSLog(@"APPDelegate里面的result = %@",resultDic);
//9000代表是成功的意思,这是支付宝官方认定的,别问为什么!还有一点,这个9000是支付宝给你返回的支付成功信息,强烈不建议前端直接就以这个9000为标准判断支付成功,应该把这个字典传给后台,让后台记录判断之后,再给前端返回!前端再显示结果给用户知道。切记切记!!!
if([resultDic[@"resultStatus"]isEqualToString:@"9000"]) {
//然后和后台商量,支付宝给我们返回的一个字典要怎么传给后台,是直接就传了,还是说要再做点什么修改,我这里就修改了,麻烦的一比。
NSString* str =resultDic[@"result"];
NSString*d5 = [strstringByReplacingOccurrencesOfString:@"\""withString:@""];
NSString* d6 = [d5stringByReplacingOccurrencesOfString:@"{"withString:@""];
NSString* d7 = [d6stringByReplacingOccurrencesOfString:@"}"withString:@""];
NSString* d8 = [d7stringByReplacingOccurrencesOfString:@"alipay_trade_app_pay_response:"withString:@""];
NSUserDefaults* user = [NSUserDefaultsstandardUserDefaults];
NSDictionary* dic = [userobjectForKey:@"sss"];
NSString* kkk = dic[@"datas"][@"key"];
NSMutableDictionary* prcc = [NSMutableDictionarydictionaryWithCapacity:10];
[prccsetValue:kkkforKey:@"key"];
[prccsetValue:[NSStringstringWithFormat:@"%@",d8]forKey:@"alipay_resp"];
[prccsetValue:resultDic[@"resultStatus"]forKey:@"resultStatus"];
[prccsetValue:@"RSA"forKey:@"sign_type"];
[prccsetValue:@"sX6/UzkKOjiCNbUPiXX1jMEdCggqGIOwnCzDEgBndSATW/9Q9rke7ubhxNxHbRhMLAtiCQchG15hw93A+pH1w3vZ60/DLh99JD7NUEqE9qOiHnV5INZ+zFzNVkuR4S9xZovSp8MAkmEVlsD6sT7fhOxPi1VRSkBM/wD3iUA/iEY="forKey:@"sign"];
//然后这里就调用了第二条接口。返回结果如果成功了,就直接调用通知,跳转到指定的界面。
[NetWorkingpostWithUrlString:zhifubao_Resultparameters:prccsuccess:^(iddata) {
NSLog(@"网络请求成功");
NSMutableDictionary* dict = [NSMutableDictionarydictionaryWithCapacity:10];
dict = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragments|NSJSONReadingMutableLeaveserror:nil];
NSLog(@"成功了吗!!!!!%@",dict);
if([dict[@"msg"]isEqualToString:@"1"]) {
NSLog(@"的确是1111");
//创建通知
NSNotification*notification =[NSNotificationnotificationWithName:@"tongzhi"object:niluserInfo:dict];
//通过通知中心发送通知
[[NSNotificationCenterdefaultCenter]postNotification:notification];
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"支付结果"message:@"支付成功"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}else{
NSLog(@"支付结果上传服务器失败");
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"支付结果"message:@"支付失败"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}
}failure:^(NSError*error) {
NSLog(@"网络请求失败");
}];
}else{
//创建通知
NSNotification*notificatio =[NSNotificationnotificationWithName:@"DefeatZhifubao"object:niluserInfo:nil];
//通过通知中心发送通知
[[NSNotificationCenterdefaultCenter]postNotification:notificatio];
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"支付结果"message:@"支付失败"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}
}];
//授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processAuth_V2Result:urlstandbyCallback:^(NSDictionary*resultDic) {
NSLog(@"result = %@",resultDic);
//解析auth code
NSString*result = resultDic[@"result"];
NSString*authCode =nil;
if(result.length>0) {
NSArray*resultArr = [resultcomponentsSeparatedByString:@"&"];
for(NSString*subResultinresultArr) {
if(subResult.length>10&& [subResulthasPrefix:@"auth_code="]) {
authCode = [subResultsubstringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果authCode = %@", authCode?:@"");
}];
}
//下面的这个是微信调用的方法!没错!微信就是这么一小句话就调用起来了!
return[WXApihandleOpenURL:urldelegate:self];
returnYES;
}
//下面这个方法是9.0以后的API的接口
- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options
{
if([url.hostisEqualToString:@"safepay"]) {
//支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary*resultDic) {
NSLog(@"9.0以后的新接口API:result = %@",resultDic);
NSLog(@"1111111111");
//9000代表是成功的意思,这是支付宝官方认定的,别问为什么!还有一点,这个9000是支付宝给你返回的支付成功信息,强烈不建议前端直接就以这个9000为标准判断支付成功,应该把这个字典传给后台,让后台记录判断之后,再给前端返回!前端再显示结果给用户知道。切记切记!!!
if([resultDic[@"resultStatus"]isEqualToString:@"9000"]) {
//然后和后台商量,支付宝给我们返回的一个字典要怎么传给后台,是直接就传了,还是说要再做点什么修改,我这里就修改了,麻烦的一比。
NSString* str =resultDic[@"result"];
NSString*d5 = [strstringByReplacingOccurrencesOfString:@"\""withString:@""];
NSString* d6 = [d5stringByReplacingOccurrencesOfString:@"{"withString:@""];
NSString* d7 = [d6stringByReplacingOccurrencesOfString:@"}"withString:@""];
NSString* d8 = [d7stringByReplacingOccurrencesOfString:@"alipay_trade_app_pay_response:"withString:@""];
NSUserDefaults* user = [NSUserDefaultsstandardUserDefaults];
NSDictionary* dic = [userobjectForKey:@"sss"];
NSString* kkk = dic[@"datas"][@"key"];
NSMutableDictionary* prcc = [NSMutableDictionarydictionaryWithCapacity:10];
[prccsetValue:kkkforKey:@"key"];
[prccsetValue:[NSStringstringWithFormat:@"%@",d8]forKey:@"alipay_resp"];
[prccsetValue:resultDic[@"resultStatus"]forKey:@"resultStatus"];
[prccsetValue:@"RSA"forKey:@"sign_type"];
[prccsetValue:@"sX6/UzkKOjiCNbUPiXX1jMEdCggqGIOwnCzDEgBndSATW/9Q9rke7ubhxNxHbRhMLAtiCQchG15hw93A+pH1w3vZ60/DLh99JD7NUEqE9qOiHnV5INZ+zFzNVkuR4S9xZovSp8MAkmEVlsD6sT7fhOxPi1VRSkBM/wD3iUA/iEY="forKey:@"sign"];
//然后这里就调用了第二条接口。返回结果如果成功了,就直接调用通知,跳转到指定的界面。
[NetWorkingpostWithUrlString:zhifubao_Resultparameters:prccsuccess:^(iddata) {
NSLog(@"网络请求成功");
NSMutableDictionary* dict = [NSMutableDictionarydictionaryWithCapacity:10];
dict = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragments|NSJSONReadingMutableLeaveserror:nil];
NSLog(@"成功了吗!!!!!%@",dict);
if([dict[@"msg"]isEqualToString:@"1"]) {
//创建通知
NSNotification*notificationn =[NSNotificationnotificationWithName:@"tongzhinine"object:niluserInfo:dict];
//通过通知中心发送通知
[[NSNotificationCenterdefaultCenter]postNotification:notificationn];
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"支付结果"message:@"支付成功"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}else{
NSLog(@"支付结果上传服务器失败");
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"支付结果"message:@"支付失败"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}
}failure:^(NSError*error) {
NSLog(@"网络请求成功");
}];
}else{
//创建通知
NSNotification*notificati =[NSNotificationnotificationWithName:@"DefeatZhifubaonine"object:niluserInfo:nil];
//通过通知中心发送通知
[[NSNotificationCenterdefaultCenter]postNotification:notificati];
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:@"支付结果"message:@"支付失败"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}
}];
//授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processAuth_V2Result:urlstandbyCallback:^(NSDictionary*resultDic) {
NSLog(@"result = %@",resultDic);
//解析auth code
NSString*result = resultDic[@"result"];
NSString*authCode =nil;
if(result.length>0) {
NSArray*resultArr = [resultcomponentsSeparatedByString:@"&"];
for(NSString*subResultinresultArr) {
if(subResult.length>10&& [subResulthasPrefix:@"auth_code="]) {
authCode = [subResultsubstringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果authCode = %@", authCode?:@"");
}];
}
//下面的这个是微信调用的方法!没错!微信就是这么一小句话就调用起来了!
return[WXApihandleOpenURL:urldelegate:self];
returnYES;
}
下面轮到微信支付了。微信比支付宝简单的太多太多了。因为微信分享如果你是使用了Share SDK的话,那你做微信支付的时候,根本就不需要再集成什么SDK了,直接就用分享的那个SDK就OK了!
所以这里直接就上硬菜了!
和后台商量之后,直接只需要一条接口就OK了
微信支付APP预支付申请,含加签
调用接口(post)
www.baidu.com
请求参数
key (会员登录令牌)
pay_sn 支付编号
subject 订单主题描述信息
amount 订单金额
返回数据
app 支付请求数据集合(包含sign)
微信只有一条接口,也是在微信支付按钮的点击方法那里写
[NetWorkingpostWithUrlString:weixinzhifu_Signaparameters:prccsuccess:^(iddata) {
NSLog(@"网络请求成功");
[HUDhideAnimated:YES];
NSMutableDictionary* dict = [NSMutableDictionarydictionaryWithCapacity:10];
dict = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragments|NSJSONReadingMutableLeaveserror:nil];
NSLog(@"微信加签后返回的数据==%@",dict);
//NSLog(@"打断之后的数据=%@",arr);
if([dict[@"msg"]isEqualToString:@"1"]) {
//调起微信支付
PayReq*request = [[PayReqalloc]init];
request.partnerId= dict[@"datas"][@"app"][@"partnerid"];
request.prepayId= dict[@"datas"][@"app"][@"prepayid"];
request.package=dict[@"datas"][@"app"][@"package"];
request.nonceStr= dict[@"datas"][@"app"][@"noncestr"];
request.timeStamp= [dict[@"datas"][@"app"][@"timestamp"]intValue];
//这里要注意key里的值一定要填对,微信官方给的参数名是错误的,不是第二个字母大写
NSMutableDictionary*signParams = [NSMutableDictionarydictionary];
[signParamssetObject:@"wx5942cca2360ff745"forKey:@"appid"];
[signParamssetObject: dict[@"datas"][@"app"][@"partnerid"]forKey:@"partnerid"];
[signParamssetObject: request.nonceStrforKey:@"noncestr"];
[signParamssetObject: request.packageforKey:@"package"];
[signParamssetObject: dict[@"datas"][@"app"][@"timestamp"]forKey:@"timestamp"];
[signParamssetObject: request.prepayIdforKey:@"prepayid"];
//生成签名
NSString*sign= dict[@"datas"][@"app"][@"sign"];
//添加签名
request.sign= sign;
//调起微信开始支付!!
[WXApisendReq:request];
NSLog(@"这是微信的打印");
}
}failure:^(NSError*error) {
NSLog(@"网络请求失败");
[HUDhideAnimated:YES];
}];
因为微信的支付的方法都是一样的,指的是9.0以前的9.0以后的都是那2个方法,而且微信只需要一句话,所以我这里我就不在写那2个方法了。但是还有微信一个9.0以前的方法,虽然无用,但是也写出来,显得全面一点,可以忽略的。
//就是下面的这个方法了
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
{
NSLog(@"11111WQEQ");
return[WXApihandleOpenURL:urldelegate:self];
}
最后一步就是就是微信给我们返回的信息的接收方法
-(void) onResp:(BaseResp*)resp
{
NSString*strMsg = [NSStringstringWithFormat:@"errcode:%d", resp.errCode];
NSString*strTitle;
if([respisKindOfClass:[SendMessageToWXRespclass]])
{
strTitle =@"发送媒体消息结果";
}
if([respisKindOfClass:[PayRespclass]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
strTitle = [NSStringstringWithFormat:@"支付结果"];
switch(resp.errCode) {
caseWXSuccess:{
strMsg =@"恭喜您,支付成功!";
//[MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"success"}];
NSLog(@"%@",strMsg);
break;
}
caseWXErrCodeUserCancel:{
strMsg =@"已取消支付!";
//[MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"cancle"}];
NSLog(@"%@",strMsg);
break;
}
default:{
strMsg = [NSStringstringWithFormat:@"支付失败!"];
//[MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"cancle"}];
NSLog(@"%@",strMsg);
break;
}
}
//创建通知
NSNotification*notificationnn =[NSNotificationnotificationWithName:@"weixinbaotongzhi"object:niluserInfo:nil];
//通过通知中心发送通知
[[NSNotificationCenterdefaultCenter]postNotification:notificationnn];
UIAlertView*alert = [[UIAlertViewalloc]initWithTitle:strTitlemessage:strMsgdelegate:selfcancelButtonTitle:nilotherButtonTitles:@"确定",nil];
[alertshow];
}
}