10-19-92

一、使用支付宝进行一个完整的支付功能,大致有以下步骤:

  1)向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)

  2)下载相应的公钥私钥文件(加密签名用)

  3)下载支付宝SDK

  4)生成订单信息,签名加密

  5)调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道

  6)支付完毕后,支付宝客户端会自动跳回到原来的应用程序

  7)在原来的应用程序中显示支付结果给用户看

流程图如下

       

 

下载SDK网站:http://club.alipay.com/        进去之后选择-->支付宝接口集成-->支付宝接口资料下载-->快捷支付(无限)点击下载

在下载包里提供了非常详细的文档,如何签约,如何获得公匙和私匙,如何调用支付接口等。。

调用安全支付数据流程:用户购买-->生成订单-->订单签名-->调用安全支付服务-->回调支付结果-->商户验签支付结果

如果是服务器端开发就选服务器Demo,,我们选择客户端Demo

第一次打开Demo时,直接变异可能会出现以下问题:

解决办法:Build Settings-->Build Active Architecture Only --> YES改为NO

也可能是下面的问题:

 错误原因是项目的部署版本设置太低了,从3.0改为4.3即可

此处有图。。。。

要想集成支付功能,首先将Demo中的 openssl、Util文件夹,Order.h、Order.m 以及Frameworks下的libcrypto.a、libssl.a 、AlipaySDK.bundle、AlipaySDK.framework 加入到项目中就可以实现支付了,至于其他的一些可以选加,然后依次添加依赖的库。创建PCH文件包含头文件

#import <UIKit/UIKit.h>  #import <Foundation/Foundation.h>  

然后编译会有一个错误:#include<openssl/asn1.h>找不到,Xcode5可以直接导入,Xcode6以后需要自己配置指定路径,这个头文件时放在.a中的。

解决办法:在Header Search Path中配置sdk中点a文件所在的目录:  当前路径/项目名字/AlipaySDK.bundle所在文件夹,,没有救不写,具体看自己的项目结构  

注意第6步有个细节.在工程配置中设置URL Schemes,如果不设置,那么支付跳转到支付宝后,无法再回到自己的app

调用支付接口可以参考AlixPayDemoViewController的下面方法,如何创建订单、如何签名、如何调用支付接口,都在这个方法里面了

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

 

接口调用步骤:

1.封装订单模型
AlixPayOrder *order = [[AlixPayOrder alloc] init];
// 生成订单描述
NSString *orderSpec = [order description];

2.签名
id<DataSigner> signer = CreateRSADataSigner(@“私钥key”);
// 传入订单描述 进行 签名
NSString *signedString = [signer signString:orderSpec];


3.生成订单字符串
NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                         orderSpec, signedString, @"RSA"];

4.调用支付接口
AlixPay * alixpay = [AlixPay shared];
// appScheme:商户自己的协议头
int ret = [alixpay pay:orderString applicationScheme:appScheme];

 二、上代码,,Demo里的 导入相关头文件

.h

#import <UIKit/UIKit.h>

//
//测试商品信息封装在Product中,外部商户可以根据自己商品实际情况定义
//
@interface Product : NSObject{
@private
    float     _price;
    NSString *_subject;
    NSString *_body;
    NSString *_orderId;
}

@property (nonatomic, assign) float price;
@property (nonatomic, copy) NSString *subject;
@property (nonatomic, copy) NSString *body;
@property (nonatomic, copy) NSString *orderId;

@end

@interface APViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITableView *productTableView;
@property(nonatomic, strong)NSMutableArray *productList;
- (IBAction)auth:(id)sender;

@end

 

.m

#import "APViewController.h"
#import "Order.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>

#import "APAuthV2Info.h"

@implementation Product


@end

@interface APViewController ()

@end

@implementation APViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self generateData];
}


#pragma mark -
#pragma mark   ==============产生随机订单号==============


- (NSString *)generateTradeNO
{
    static int kNumber = 15;
    
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand(time(0));
    for (int i = 0; i < kNumber; i++)
    {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}



#pragma mark -
#pragma mark   ==============产生订单信息==============

- (void)generateData{
    NSArray *subjects = @[@"1",
                          @"2",@"3",@"4",
                          @"5",@"6",@"7",
                          @"8",@"9",@"10"];
    NSArray *body = @[@"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据",
                      @"我是测试数据"];
    
    if (nil == self.productList) {
        self.productList = [[NSMutableArray alloc] init];
    }
    else {
        [self.productList removeAllObjects];
    }
    
    for (int i = 0; i < [subjects count]; ++i) {
        Product *product = [[Product alloc] init];
        product.subject = [subjects objectAtIndex:i];
        product.body = [body objectAtIndex:i];
        
        product.price = 0.01f+pow(10,i-2);
        [self.productList addObject:product];
    }
}


#pragma mark -
#pragma mark UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 55.0f;
}

#pragma mark -
#pragma mark UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.productList count];
}




//
//用TableView呈现测试数据,外部商户不需要考虑
//
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                                    reuseIdentifier:@"Cell"];
    
    Product *product = [self.productList objectAtIndex:indexPath.row];

    cell.textLabel.text = product.body;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"一口价:%.2f",product.price];
    
    return cell;
}


#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 = @"";//商户ID
    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];
//        return;
//    }
    // 把商品转化成定单信息
    /*
     *生成订单信息及签名
     */
    //将商品信息赋予AlixPayOrder的成员变量
    Order *order = [[Order alloc] init];
    order.partner = partner;//设置商户ID
    order.seller = seller;//设置支付宝帐号
    //订单ID必须在系统中是惟一
    //时间2015022811111 + 随机数
    order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定) 订单编号
    order.productName = product.subject; //商品标题
    order.productDescription = product.body; //商品描述
    order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格
    order.notifyURL =  @"http://www.xxx.com"; //回调URL
    
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";// 支付类型 1.支付  2.全额退款 3.取消支付 4.部分退款
    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);
    //请求参数
    /*
   partner=""&seller_id=""&out_trade_no="4CGUBYMA8OGAFCN"&subject="1"&body="我是测试数据"&total_fee="0.02"&notify_url="http://www.xxx.com"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&show_url="m.alipay.com"
     */
    
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    //RSA 加密技术 - 加密数据 类似于MD5
    // 签名对象
    id<DataSigner> signer = CreateRSADataSigner(privateKey);

    //签名数据
    /*
     * 签名 类似于每个人的指纹
     * abc 签名 -> 得到一指纹(字符串)
     * abd 签名 -> 得到一指纹(字符串)
     
     *支付 签名方式 只有自己和支付宝才知道
     * total_fee=0.02&seller_id=xxx@qq.com&sign=ABC -> 签名 ->指纹(ABC)
     * total_fee=0.03&seller_id=aaa@qq.com&sign=ABC -> 签名 ->指纹(ABD)
     */
    NSString *signedString = [signer signString:orderSpec];
    
    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        //一个完成的数据提交到支付宝的服务器,一定要有一个签名(sign)
        /*
         partner=""&seller_id=""&out_trade_no="4CGUBYMA8OGAFCN"&subject="1"&body="我是测试数据"&total_fee="0.02"&notify_url="http://www.xxx.com"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&show_url="m.alipay.com&sign="ABC"&sign_type="RSA""
         */
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"reslut = %@",resultDic);
        }];
        
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

@end

 

 demo下载地址:http://pan.baidu.com/s/1hrfFWhu

 

银联支付官方SDK下载地址:https://open.unionpay.com/ajweb/help/query    手机支付属于手机控件支付产品

1.SDK 说明

SDK 分为以下两个版本:

1.支持纯无卡交易静态库,以下简称 UPPayPlugin,包含文件:

UPPayPlugin.h UPPayPluginDelegate.h libUPPayPlugin.a

2、支持纯无卡交易和 VIPOS 音频口支付静态库,以下简称 UPPayPluginPro,公司自主研发的 VIPOS(即“voice interface POS ”音频接口 POS 机)支付平台,与银联联合运营,并协助银 联制定了手机 POS 等安全规范、业务与技术标准。

包含文件:

UPPayPluginPro.h

UPPayPluginDelegate.h libUPPayPluginPro.a

3、添加 SDK 包

a.根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到 UPPayDemo 工程中;

b.如 果 你 选 择 的 是 UPPayPlugin 版 本 , 添 加 QuartzCore.framework 、

Security.framework 到工程中;

c.如 果 你 选 择 的 是 UPPayPluginPro 版 本 , 添 加 QuartzCore.framework 、AudioToolbox.framework, CoreAudio.framework 、 MediaPlayer.framework,AVFoundation.framework 和 Security.framework 到工程中

工程配置:

1.在需要调用支付控件的源文件内引用头文件 UPPayPlugin.h 或 UPPayPluginPro.h(注意:如果工程的 compile source as 选项的值不是 Objective–C++,则引用此头文件的文件类型都要改为.mm)

2.在工程的 Build Settings 中找到 Other Linker Flags 中添加-ObjC 宏

3.将 xcode 工程中 Build Setting -> Apple LLVM compiler Language 标签下的 C++ Language Dialect 和 C++ Standard Library 属性值修改为 Compiler Default

具体看例子吧:http://pan.baidu.com/s/1dEyINKl

 

微信支付

微信支付官方SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

在官方的开发者平台上---->开发者文档------>APP支付----->APP端开发步骤

 

1:去微信开放平台注册应用

https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN&token=2c0fee9c43e1eb8f9febcc7cb73abf598e2d4011

创建移动应用并成功之后会收到腾讯发来的邮件

 

通过邮件你能获得重要的参数:

(1):AppID

(2):微信支付商户号

(4):前往商户平台完成入驻

(4):API秘钥(自己设置即可,注意一定要32位字母加数字的组合)记得保存好秘钥,以后要使用

设置密钥

有了这些参数后,我们就可以开发自己的项目了.

首先我们需要把我们下载好的sdk导入到我们工程当中.SDKExport文件下的3个文件是必须要导入到工程中去的.除了这个以外,我们还需要把依赖库给添加到工程中去

具体看demo:http://pan.baidu.com/s/1sk5gazr

 

 

 

学习别人的SDK

1.pch

2.看依赖

3.项目里导入文件

4.找不到某某文件 -- 查看源项目的Header Searth

分类:

技术点:

相关文章: