iOS开发:移动支付(支付宝+微信)

一.移动支付

  1. 什么叫移动支付:移动支付也称为手机支付,就是允许用户使用其移动终端(通常是手机)对所消费的商品或服务进行账务支付的一种服务方式。单位或个人通过移动设备、互联网或者近距离传感直接或间接向银行金融机构发送支付指令产生货币支付与资金转移行为,从而实现移动支付功能。移动支付将终端设备、互联网、应用提供商以及金融机构相融合,为用户提供货币支付、缴费等金融业务。

  2. 微信和支付宝支付:在移动互联网兴起下比较大众的两款三方支付平台,下面将详细介绍在iOS开发中,如何集成支付宝和微信支付


二.支付宝支付

前期准备工作

  1. 创建应用并获取APPID:
    首先开发的时候必须叫公司申请一个商家账号,之后会审核,审核成功后创建你的应用,创建成功后会有一个appid(应用唯一标识),当我们集成支付的时候需要用这个来注册使用(下面会讲到)

  2. 配置应用环境:
    请到官方查看:生成与配置密钥,这里mac和windows不一样注意区分,这里你会下载一个工具会自动生成公私钥(公私钥是配对使用的,一定要配对,也就是你用工具一起生成的,并且后台调用接口的时候需要这个来签名等),这里需要将公钥和私钥配置到你的账号中,这里面的RSA就是一种加密的方式而已。

  3. 获取支付宝公钥:
    应用上线后在账号总查看支付宝公钥,即可获取支付宝公钥,主要用于支付宝返回数据的验签。

  4. 其他的比如完善应用信息,添加应用功能请自行添加,很简单,这里不说

集成使用

  1. 导入支付宝SDK:这里下载 支付宝支付demo,解压后,将

1.AlipaySDK.bundle
2.AlipaySDK.framework

导入到项目中,这里建议你也将order.h这个类也导入,当你支付的时候需要用

  1. 导入依赖库:


    LB1PlBHKpXXXXXoXXXXXXXXXXXX.png

注意:
如果是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返回的结果为准。(这里支付宝其实也一样)

自此微信支付就完了,微信支付说的简单,但是如果你看懂了支付宝支付,那么微信支付就不在话下


PS:其实如果公司有条件的话还是建议用集成好的支付,比如ping++ 等.里面集成了百度钱包,apple pay, 银联等,包含的支付方式比较多,这样也减轻开发者工作量.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容