最近又用到了支付功能,由于苹果最近大力推广applePay,所以有些软件如果使用的是第三方的支付功能那么审核可能不会通过,这里介绍微信支付,支付宝支付,常见的错误,以及整合方法.
微信支付
1、进入微信开发者平台,选择我要接入
2、根据流程 注册 认证 创建应用等等按照下图来就行了
注意选择你想要用的东西
这里是移动应用支付
然后查看开发者文档
链接: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
上面做好之后 开始的查看开发者文档
我们先下载需要的SDK
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
我们直接下载Demo,然后将Demo拖入自己的项目中。
下载后解压,是这样的
打开项目之后
然后开始程序员该做的事::::::
1.打开工程的info配置URL Types
分别填写你的identity 以及url schemes
其中url schemes 为你的appID,也就是
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[[SendMsgToWeChatViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
} else {
self.viewController = [[[SendMsgToWeChatViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
//向微信注册,,这里换成你的APPID
[WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
return YES;
}
**注意,这里一定要填写,url schemes是为了App的跳转使用的,如果不填写,那么你支付完成之后,将没有办法跳转回来。
**
然后在你页面跳转的时候加上这行代码:
- (void)bizPay {
NSString *res = [WXApiRequestHandler jumpToBizPay];
if( ![@"" isEqual:res] ){
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失败" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alter show];
[alter release];
}
}
WXApiRequestHandler jumpToBizPay
WXApiRequestHandler 这个类在Demo中有,所以如果你不想自己写就拖进你的工程吧!!
在jumpToBizPay 中,,
注意,你需要请求你自己的家的服务器,让他给你返回一些参数,如支付的所需的一些数据,搞后台的都知道,服务端的也有配置介绍
+ (NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程实现
// 注意:参数配置请查看服务器端Demo
// 更新时间:2015年11月20日
//============================================================
NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服务端返回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.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=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
return @"";
}else{
return [dict objectForKey:@"retmsg"];
}
}else{
return @"服务器返回错误,未获取到json对象";
}
}else{
return @"服务器返回错误";
}
}
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict objectForKey:@"partnerId"];//商户号,
req.prepayId = [dict objectForKey:@"prepayId"];//包含了商品的所有信息
req.nonceStr = [dict objectForKey:@"nonceStr"];//随机字符串
req.timeStamp = stamp.intValue;//时间戳
req.package = [dict objectForKey:@"package"];@"Sign=WXPay"固定不变
req.sign = [dict objectForKey:@"sign"];//签名
最后有一些库以及代码需要添加
Demo说明:
注意:
1.本Demo只是做一个体验和演示,发起支付的流程;
2.下单和签名、查单和支付通知均在服务器后台实现,请参考后台SDK代码。
3.本Demo是64位的SDK
4.直接运行可体验
5.API详见:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1
开发步骤总结:
1.开发微信APP支付,需要先去微信开放平台申请移动应用,并开通微信支付功能,通过审核后方可进行开发;
2.用XCode打开项目,【项目属性】-【Info】-【URL Schemes】设置微信开放平台申请的应用APPID,如图文件夹下”设置appid.jpg”所示。如果这的APPID设置不正确将无法调起微信支付;
3.需要调用代码注册APPID:[WXApi registerApp:APP_ID withDescription:@”demo 2.0”];项目该APPID需与步骤2中APPID保持一致;
4.支付请求:WXApiRequestHandler.m中的jumpToBizPay方法实现了唤起微信支付;
5.支付完成回调:WXApiManager.m中的onResp方法中接收返回支付状态。
支付宝支付:
以下将介绍支付宝支付
我想说的:
1.了解并熟悉第三方的SDk的接口。
2.熟悉其Demo中页面的跳转的逻辑关系。
3.将Demo拖入工程中如何解决其他SDk重复的问题,如何解决一些文件的冲突问题,是否支持bitcode,是否需要c环境,是否需要URL schemes进行app之间传值
4.自己如何根据UI进行页面的调试,如何添加Demo中没有的一些功能,比如:某直播的SDK没有礼物功能,我是这样做的http://blog.csdn.net/xoxo_x/article/details/52044388。
5.记得一句话:所有的程序都是源于生活,一切的SDk接口都是完成某件事的必要操作,比如现实生活中你要买东西首先你要知道三点:
1、东西是什么
2、价格是多少
3、把钱给谁
4、给了钱之后,他是怎么知道的
这就对应支付宝当中的:
1、商品信息
2、价格
3、商户ID
4、信息通知
附图:开始进行支付宝支付。
https://app.alipay.com/market/productIndex.htm
下载SDK
····链接
https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
下载完成之后
解压缩之后:
是这样的
更新日志不用看,直接看服务端的Demo,然后解压缩ios端的。
Demo可以运行的。大家可以运行一下试试,整体来说,支付宝支付比较简单。
服务端 负责生成订单及签名,及接受支付异步通知。
客户端 负责使用服务端传来的订单信息调用支付宝支付接口,及根据SDK同步返回的支付结果展示结果页。
1、添加支付宝所需的库
2、在plist文件中添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>alipay.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>alipayobjects.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
注意添加URL schemes 值为自己定义的,需要有自己的特点,以免和其他的app重复,导致支付之后没有办法跳转到自己app,官方是这么说的
好了,配置结束了,在你需要支付的地方加上如下代码
#pragma mark -
#pragma mark ==============点击订单模拟支付行为==============
//
//选中商品调用支付宝极简支付
//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
/*
*点击获取prodcut实例并初始化订单信息
*/
Product *product = [self.productList objectAtIndex:indexPath.row];
/*
*商户的唯一的parnter和seller。
*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
*/
/*============================================================================*/
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
NSString *partner = @"";
NSString *seller = @"";
NSString *privateKey = @"";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//partner和seller获取失败,提示
if ([partner length] == 0 ||
[seller length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少partner或者seller或者私钥。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
return;
}
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = partner;
order.sellerID = seller;
order.outTradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
order.subject = product.subject; //商品标题
order.body = product.body; //商品描述
order.totalFee = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格
order.notifyURL = @"http://www.xxx.com"; //回调URL
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @"alisdkdemo";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
NSString *partner = @"";
NSString *seller = @"";
NSString *privateKey = @"";
这是你注册支付宝的时候支付宝给你返回的,添上就可以。
为了避免出错,Demo中的文件能拖得就都拖过来。
最后注意这一点:
好了支付宝集成完毕。