一.移动支付
什么叫移动支付:移动支付也称为手机支付,就是允许用户使用其移动终端(通常是手机)对所消费的商品或服务进行账务支付的一种服务方式。单位或个人通过移动设备、互联网或者近距离传感直接或间接向银行金融机构发送支付指令产生货币支付与资金转移行为,从而实现移动支付功能。移动支付将终端设备、互联网、应用提供商以及金融机构相融合,为用户提供货币支付、缴费等金融业务。
微信和支付宝支付:在移动互联网兴起下比较大众的两款三方支付平台,下面将详细介绍在iOS开发中,如何集成支付宝和微信支付
二.支付宝支付
前期准备工作
创建应用并获取APPID:
首先开发的时候必须叫公司申请一个商家账号,之后会审核,审核成功后创建你的应用,创建成功后会有一个appid(应用唯一标识),当我们集成支付的时候需要用这个来注册使用(下面会讲到)配置应用环境:
请到官方查看:生成与配置密钥,这里mac和windows不一样注意区分,这里你会下载一个工具会自动生成公私钥(公私钥是配对使用的,一定要配对,也就是你用工具一起生成的,并且后台调用接口的时候需要这个来签名等),这里需要将公钥和私钥配置到你的账号中,这里面的RSA就是一种加密的方式而已。获取支付宝公钥:
应用上线后在账号总查看支付宝公钥,即可获取支付宝公钥,主要用于支付宝返回数据的验签。其他的比如完善应用信息,添加应用功能请自行添加,很简单,这里不说
集成使用
- 导入支付宝SDK:这里下载 支付宝支付demo,解压后,将
1.AlipaySDK.bundle
2.AlipaySDK.framework
导入到项目中,这里建议你也将order.h这个类也导入,当你支付的时候需要用
-
导入依赖库:
注意:
如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib
4.本地集成使用:意思就是签名,商品的信息在本地写好,这里可以测试的时候使用,正式开发app不要这样使用,主要是不安全,这样为了签名你的私钥和公钥必须放在本地,这里本地集成使用不在重复赘述,请查看 官方文档
5:通过后台服务器获取签名,支付商品信息支付:主要是在app中将需要购买的商品信息,通过后台接口下单,下单后会将商品的订单号返回(这里的订单号是后台人员自行分配的,为了家下来的支付做准备),之后通过这个订单号调用后台接口获取支付数据(主要是获取商品信息,签名等,你支付需要的都在这里面),之后拿着这些数据去支付就行了,后面注意回调的判断和支付成功后者失败的提醒就行了,下面是实现代码:
1.导入头文件并注册:
#import <AlipaySDK/AlipaySDK.h>//导入头文件
[WXApi registerApp:WX_PAY_PPID withDescription:@"xxx"];//注册支付宝,这里写到appdelegate里
2.下单:下单的时候后台提供一个接口,将提交的数据保存在后台服务器并生成一个唯一的订单号,这个订单号和数据是关联的
3.获取支付数据,签名等,并调用支付宝支付:
+ (void)jumpToBizAliPay:(XSTAlipayModel *) modle andViewController:(UIViewController *)weSelf{
//这里的model是我用上面的订单号请求的支付的数据模型(里面包含了支付的所有信息,)
/*
*商户的唯一的parnter和seller。
*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
*/
NSString *partner = modle.partner;
NSString *seller = modle.seller_id;
//partner和seller获取失败,提示
if ([partner length] == 0 || [seller length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少partner或者seller或者私钥。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
return;
}
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = partner;
order.sellerID = seller;
order.outTradeNO = modle.out_trade_no; //订单ID(由商家自行制定)
order.subject = modle.subject; //商品标题
order.body = modle.body; //商品描述
order.totalFee = modle.total_fee; //商品价格
order.notifyURL = modle.notify_url; //回调URL
order.service = modle.service;
order.paymentType = modle.payment_type;
order.inputCharset = modle._input_charset;
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com";
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @"xstAlipay";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = (RSADataSigner *)modle.sign;
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (modle.sign) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, modle.sign, modle.sign_type];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"%@", resultDic);
NSInteger resultStatus = [resultDic[@"resultStatus"] integerValue];
if (resultStatus == 9000) {
//发送通知,这里是个block,当成功后会发送一个通知,跳转到支付成功的界面,这里是当返回app的时候才调用
NSNotification * note = [[NSNotification alloc] initWithName:@"APS" object:@"succes" userInfo:nil];
[[NSNotificationCenter defaultCenter] postNotification:note];
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"支付结果" message:@"放弃支付" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
}];
}
}
4回调:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
if ([WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]) {
return YES;//这里是微信支付
}else{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
}];
return YES;//这里是支付宝支付
}
}
注意:
- 上面的代码的model模型是我用订单号通过后台接口(后台接口会调用支付宝提供的API返回一些数据,当然这些事后台操作的,你只要要获取这个model就行)
- NSString *orderSpec = [order description];//这句代码拼接的字符串要和后台调用支付宝支付API的拼接的字符串一直,否者会一直报错
- 支付成功后的回到,这个时候其实虽然支付成功了,但是实际上还需要调用后台接口,后台的回调成功后才算是支付成功.
- 注意要设置支付宝的白名单,否者在你想返回app的时候会返回不了
- 注意要在appdelegate里面实现了- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options这个方法才能回调成功
以上步骤支付宝支付就完成了
三.微信支付
前期准备工作:
和支付宝一样这里不再赘述
集成使用:
其实和支付宝差不多,下面简单说说步骤和注意事项
1.导入微信支付SDK:在这里下载微信支付demo,解压后将SDK导入到项目中
2.导入依赖库:支付宝导入了依赖库后,微信就不用导入什么了
3.注册appid
3.集成使用:和支付宝一样见参考微信支付文档参考代码如下:
+ (void)jumpToBizWeipay:(XSTWeiPayModel *) modle andViewController:(UIViewController )weSelf{
if ([WXApi isWXAppInstalled]) {//这里判断有无微信客户端,没有就跳转到app store进行安装
//调起微信支付
PayReq req = [[PayReq alloc] init];
req.partnerId = modle.partnerid;
req.prepayId = modle.prepayid;
req.nonceStr = modle.noncestr;
req.timeStamp = modle.timestamp.intValue;
req.package = modle.package;
req.sign = modle.sign;
[WXApi sendReq:req];
}else{
dispatch_async(dispatch_get_main_queue(), ^{
[XSTTools showAlertWith:@"取消" andWIthSure:@"确定" andWithTitle:@"提醒" andWithString:@"你还未安装微信,点击确定进入app store安装" andWithView:nil andWith:weSelf andWithType:WEIXIN andActionStyle:UIAlertControllerStyleAlert];
});
}
}
4.回调:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
if ([WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]) {
return YES;//这里是微信支付
}else{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
}];
return YES;//这里是支付宝支付
}
}
注意:
- 注意白名单设置
- 注意判断手机中有无微信app,如果没有是需要判断提示手机没有安装微信app,这里可以给个弹框跳转到app store的微信url进行安装,这里和支付宝不同,支付宝不用判断,没有支付宝app会进入web网页支付.
- 微信支付这个方法没有看到blcok回调,那么他是怎么判断支付成功的呢?其实这里微信写的是代理的方式,当你导入微信sdk的时候把WXApiManager.h这个类一并导入,这个类里面写了相应的方法.
- 照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。(这里支付宝其实也一样)
自此微信支付就完了,微信支付说的简单,但是如果你看懂了支付宝支付,那么微信支付就不在话下