技术文章分类(180)

技术随笔(11)

ios支付宝支付集成

首先,我必须声明,支付宝就是个坑,接口做的一塌糊涂。

在今天前的官网上下载sdk是不能够支持arm64指令集。今天以后,https://b.alipay.com/order/productDetail.htm?productId=2014110308141993&tabId=4#ps-tabinfo-hash 这个链接可以,这也是我联系支付宝客服以后他们才上传到官网。但是很不好找。而且,这个demo也是做的一塌糊涂。

另外,有好几点很重要的,需要注意的。后面我会详细讲解到。这里我修改了官方的demo,我自认为写的比官方的要标准的多。

github demo:https://github.com/MartinLi841538513/AlixPayDemo

现在步骤:

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

2,下载相应的公钥私钥文件

3,下载添加AliPaySDK,添加SystemConfiguration.framework

4,app scheme返回设置

5,开始集成支付宝支付

 

详细步骤:

1,2步,我认为难度不大,估计需要一些营业执照之类的。公钥私钥也很容易生成,公钥放在支付宝服务器端,私钥放在客户端。

3,下载添加AliPaySDK,添加SystemConfiguration.framework

AliPaySDK包括:

设置Header Search Path ,$(SRCROOT)/根目录名(这里主要是为了openssl可以实现<>检索,所以一定要到openssl的上一级目录)

4,app scheme返回设置,这样就可以在支付完成后返回app。

下面代码也要设置:NSString *appScheme = @"Club";  其实我认为可能只需要设置一个就够了,但是我没有尝试。

5,代码集成

下面有几点是要注意的:

一,支付宝给的错误提示是一点用都没有的。我总结几个:

网络连接问题,应该是公钥私钥,partner,seller等参数错了

服务器繁忙,应该是order的属性有没有设置的。

二,partner是16位的数字,一般是2088开头的,支付宝坑货,里面还有另外一组16位的数字,很容易混淆。

在支付宝商家服务平台:https://b.alipay.com/order/pidAndKey.htm

三,order.tradeNO,order.notifyURL最好由后台提供,用来返回给后台进行数据处理。比如说支付成功,后台就给充值20块钱。

 /*
     *商户的唯一的parnter和seller。
     *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
     */
    
    /*============================================================================*/
    /*=======================需要填写商户app申请的===================================*/
    /*============================================================================*/
    NSString *partner = @"2088801770744581";
    NSString *seller = @"hubeijiaxingyue@sina.com";
    NSString *privateKey = @"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKcfzYN+td5aBCYUngMZu/i8WUazan7p+yPmiyO8aNZA2HSvbIfeTdx5g+PVqrQ3J9TypxVTtG4ukFn7OwimP+AYN4/5ZUsdYug0DalDhIrUeh6xX6uiS73Vw+m3a5GX5q/YdoIGDJFAY8eJjkqb7cYHnrNUo/9PKkQq+LJzjsCtAgMBAAECgYBbyEN9q+EFtDoDD9+XpFJvUEFXasFZ4fZiyQIxJhANWp+FtbHNDHGGW9XrEjUltATUFk9cjxPQTxJH2ImbPnJlJBXWVCdsxScf8cEYXeAvcQzYT8yPUzXmkdgcs+aZXF9v7XDNbGLL6iYjHqx9mZBivyj1IIr0+wPKLfM9q9BVoQJBAN7HUmgj0qU+sZkRRElr6S4SrvNLuM6D/d6wM7U3sp6sGp6aUk/c1VGSrcaU+fbxxovHBLnzM2IGPiS+O7vlsWsCQQDAC9lZghqpu11KzeQLnjLMCtkXUmAxkuAsWKEKUOkGI8qtw2nxIofjw2gjQQmWmkRzn1GsYup/M5PeEwFWFqRHAkEA1B8yJhrF/bW+YSMBxG9NriL4Fo0pQOqJFjrsYUbReyggiJgkfAqny25ArO85O5tnE7zCkVQyvsl27oF8WyMQVQJAbotjhR5a8rCjNtflGLrrSoBEDiSgsmh1GZG6wRFp0NrxY6xEY0UZK4Xjf8eEGWibVmKyxKP7j1TFHOObtU47KQJAbRxr5A+6bKU8eujxMwEvsZn0t3+sss6K6Vs6rH6EOkDN3vPBqL1sXlp6eZekrt5YDiXFDAsLjju3CKsoRHclBg==";
    /*============================================================================*/
    /*============================================================================*/
    /*============================================================================*/
    
    //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的成员变量
    AlixPayOrder *order = [[AlixPayOrder alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
    order.productName = product.subject; //商品标题
    order.productDescription = product.body; //商品描述
    order.amount = [NSString stringWithFormat:@"%.2f",0.1]; //商品价格
    order.notifyURL =  @"http://www.xxx.com"; //回调URL
    
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    
    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @"AliPayTest2";
    
    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    
    
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循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);
        }];
        
    }

 

虽然难度不大,但是官方文档太难,导致我们会出现很多细节问题。

posted @ 2014-11-17 23:16  坤哥MartinLi  阅读(1674)  评论(0编辑  收藏  举报