支付宝支付的详细过程

来源:互联网 发布:富士康跳樓事件知乎 编辑:程序博客网 时间:2024/05/21 10:53

1、在实现支付宝功能的时候,首先要到下载支付宝的官方demo,在官方demo中选择客户端这个文件夹,里面有一些支付功能需要的东西,现在我把这些需要的整理出来,大家下载了支付宝demo以后找到这几个文件,就可以了:AlipaySDK.bundle,AlipaySDK.framework,openssl文件夹,Util文件夹,libcrypto.a,libssl.a,还有Order的.h和.明文件,只要有了这几个文件,就可以进行下一步工作了:

2、在需要支付的控制器里导入AlipaySDK.h的头文件,此时还需要partnerID sellerID和privateKey,有了这些,就可以进行下一步了;

3、在图片标示的地方写入url,接下来就是项目的主要代码了;

4、

//支付宝支付

    /*

     *点击获取prodcut实例并初始化订单信息

     */

    

    /*

     *商户的唯一的parnterseller

     *签约后,支付宝会为每个商户分配一个唯一的 parnter seller

     */

    

    /*=======================需要填写商户app申请的===============*/

    

    NSString *partner = dic[@"partner"];

    NSString *seller = dic[@"seller_id"];

    NSString *privateKey = kPrivate_key;//商户和支付宝之间的私钥

    

    //partnerseller获取失败,提示

    if ([partner length] ==0 ||

        [seller length] == 0 ||

        [privateKey length] == 0)

    {

        UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"提示"

                                                        message:@"缺少partner或者seller或者私钥。"

                                                       delegate:self

                                              cancelButtonTitle:@"确定"

                                              otherButtonTitles:nil];

        [alert show];

        return;

    }

    

    /*

     *生成订单信息及签名

     */

    //将商品信息赋予AlixPayOrder的成员变量

    Order *order = [[Orderalloc] init];

    order.partner = partner;

    order.sellerID = seller;

    order.outTradeNO = dic[@"out_trade_no"];//订单ID(由商家自行制定)

    order.subject = dic[@"subject"];//商品标题

    order.body = dic[@"body"];//商品描述

    order.totalFee = [NSStringstringWithFormat:@"%.2f",[dic[@"total_fee"]floatValue]]; //商品价格

    order.notifyURL = dic[@"notify_url"];//回调URL

    

    order.service = dic[@"service"];

    order.paymentType = dic[@"payment_type"];

    order.inputCharset = dic[@"_input_charset"];

    order.itBPay = dic[@"it_b_pay"];

    order.showURL =@"m.alipay.com";

    

    //上面这些需要的信息都不需要自己填写,属于公司的信息

    下面这些照样子写就行了。


    //应用注册scheme,AlixPayDemo-Info.plist定义URL types

    NSString *appScheme = @"alisdkdemo";//这里就是填的上面的url里面写的那个东西。

    

    //将商品信息拼接成字符串

    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 = [NSStringstringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",

                       orderSpec, signedString, @"RSA"];

        

        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {

            NSLog(@"reslut = %@",resultDic);

        }];

    }

以上这是集成的时候所有的代码,但是我每次都会出现同一个问题:openssl/asn1.h file not found

这个问题的解决办法:

双击以后:在图片所示的位置点击加号,写入$(SRCROOT)/项目名 称/(这里是你从项目文件及找到openssl文件夹的文件名称)/支付宝SDK,例如"$(SRCROOT)/项目名称//支付宝文件夹Alipay",这里是因为我把openssl文件夹放到名为支付宝文件夹下了,所以这样写,


下面说下支付完成的回调

在application中的

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 方法里面写入如下代码


 返回的url中如果host是safety表示是支付宝支付  [url.hostisEqualToString:@"safepay"]


{

        //跳转支付宝钱包进行支付,处理支付结果

        [[AlipaySDKdefaultService] processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {

            

            //[[NSNotificationCenter defaultCenter] postNotificationName:kIsPaySuccess object:nil];

            

            NSInteger resultCode = [resultDic[@"resultStatus"]integerValue];

            if(resultCode == 9000){

                

                NSString *valueStr = resultDic[@"result"];

                处理返回结果

                NSArray *infoArr = [valueStr componentsSeparatedByString:@"&"];

                NSMutableDictionary *bigDic = [[NSMutableDictionaryalloc] init];

                for(NSString *strin infoArr){

                    

                    NSArray *keyValueArr = [strcomponentsSeparatedByString:@"="];

                    NSString *key = keyValueArr[0];

                    NSString *value = keyValueArr[1];

                    NSString *sub1 = [value substringFromIndex:1];

                    NSString *vaLue = [sub1 substringToIndex:sub1.length - 1];

                    NSDictionary *dic = @{

                                          key : vaLue

                                          };

                    [bigDic addEntriesFromDictionary:dic];

                }

                NSString *state = bigDic[@"success"];

                

                if([state isEqualToString:@"true"]){

                    //支付成功

                    

                }

                

            }else{

                支付失败!

                

            }

            NSLog(@"result = %@",resultDic);

        }];

    }


1 0
原创粉丝点击