iOS支付宝支付总结

1.按照http://doc.open.alipay.com/doc2/detail?spm=0.0.0.0.SWdJgo&treeId=59&articleId=103676&docType=1 《URLname:导入代码》将包给塞进去,配置好白名单和安全访问

安全访问在info.plist中

2. 配置包路径,一定是show in finder中的路径

Framework search Paths :$(PROJECT_DIR)/XWMerchant/ThirdParts/AlipaySDK

HeaderSearch Paths: $(PROJECT_DIR)/XWMerchant/ThirdParts/AlipaySDK

Library Search Paths: $(PROJECT_DIR)/XWMerchant/ThirdParts/AlipaySDK

 

3.配置AlipayHeader.h中的宏定义

 

#define kPartnerID @""2088开头

 /**

 *  seller:支付宝收款账号,手机号码或邮箱格式。

 */

#define kSellerAccount @""与合作者Id绑定的帐号,不要瞎搞成自己的了

/**

 *  支付宝服务器主动通知商户 网站里指定的页面 http 路径。

 */

#define kNotifyURL  @""支付宝支付完成后会通知商户的后台服务器

/**

 *  appSckeme:应用注册scheme,在Info.plist定义URLtypes,处理支付宝回调

 */

#define kAppScheme @""支付完成后回到应用中

/**

 *  private_key:商户方的私钥,pkcs8 格式。

 */

#define kPrivateKey @""//这个需要重点说说,在这里卡了一会,

    • Linux用户(以Ubuntu为例)
      $ openssl 进入OpenSSL程序
      OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥
      OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式
      OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥
      OpenSSL> exit ## 退出OpenSSL程序

生成完成之后去b.alipay.com,网站,找到我的商家服务,点击“查询PID、Key”,在合作伙伴管理密钥中设置生成的公钥,并将生成的pkcs8的私钥放在宏定义kPrivateKey里面。注册的商户移动应用现在还不知道有什么用。。。

4.支付

#pragma mark   ==============支付宝支付==============
- (void)alipay:(NSDictionary *)dic{//只包含支付订单号
    
    /*
     *生成订单信息及签名
     */
    //将商品信息赋予AlixPayOrder的成员变量
    NSString *serviceStr;
    switch (_serviceType) {
        case kXWServerTypeRecruit:
            serviceStr = @"招聘合同";
            break;
        case kXWServerTypeTurnShop:
            serviceStr = @"转店合同";
            break;
        case kXWServerTypeFindShop:
            serviceStr = @"找店合同";
            break;
        default:
            break;
    }
    self.orderItem.partner = kPartnerID;
    self.orderItem.seller = kSellerAccount;
    self.orderItem.tradeNO = dic[@"tradeNo"]; //订单ID(由商家自行制定)
    self.orderItem.productName = serviceStr; //商品标题
    self.orderItem.productDescription = @"开通服务后可以使用该服务"; //商品描述
    self.orderItem.amount = [NSString stringWithFormat:@"%.2f",0.01/*_price*/]; //商品价格
    self.orderItem.notifyURL = kNotifyURL; //回调URL
    
    self.orderItem.service = @"mobile.securitypay.pay";
    self.orderItem.paymentType = @"1";
    self.orderItem.inputCharset = @"utf-8";
    self.orderItem.itBPay = @"30m";
    self.orderItem.showUrl = @"m.alipay.com";
    
    //将商品信息拼接成字符串
    NSString *orderSpec = [self.orderItem description];
    DLog(@"orderSpec = %@",orderSpec);
    
    NSString *signedString = [self genSignedString:orderSpec withKey:kPrivateKey];//签名如果私钥和公钥配对不成功,会生成订单失败
    
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec, signedString, @"RSA"];

        [[AlipaySDK defaultService] payOrder:orderString fromScheme:kAppScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"reslut = %@",resultDic);
            
            NSDictionary *dict = (NSDictionary *)resultDic;
            NSString *resultStatus = [dict valueForKey:@"resultStatus"];
            
            if ([resultStatus isEqualToString:@"9000"]) {
                //成功
                [XWPrompt showPromptMessage:@"支付成功"];
                XWPaySuccessViewController *paySuccessVC = [[XWPaySuccessViewController alloc]init];
                paySuccessVC.payType = kPayWayTypeAlipay;
                paySuccessVC.servicetype = _serviceType;
                paySuccessVC.customerServiceDic = _customerServiceDic;
                [self.signPayVC.navigationController pushViewController:paySuccessVC animated:YES]
                ;
            }else if([resultStatus isEqualToString:@"6001"]){
                [XWPrompt showPromptMessage:@"用户取消支付"];
            }else{
                //支付成功,处理
                [XWPrompt showPromptMessage:@"订单支付失败"];
            }
            
        }];
    } else {
        [XWPrompt showPromptMessage:@"订单支付失败"];
    }

}


// 生成signedString


- (NSString *)genSignedString:(NSString *)orderSpec withKey:(NSString *)key {


    // 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncode


   id<DataSigner> signer = CreateRSADataSigner(key);


  return [signer signString:orderSpec];


}

5.配置支付宝客户端返回url处理方法

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
 
    //如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
            NSLog(@"result = %@",resultDic);
        }];
    }
    if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
  
        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}

基本上就这些了,如果不通,就看看有没有没有塞进去的包,依赖,路径,私钥公钥是否配对。

posted @ 2015-11-20 15:57  沙漠只容绿洲  阅读(248)  评论(0编辑  收藏  举报