支付宝app调用
1 支付宝调用遇到的问题:(私钥和公钥)
公钥: 是交给你的服务端和支付宝开放平台上面的
私钥: 是app启动支付宝支付的时候提交的钥匙,确保和支付宝平台上面的公钥是一对应
生成:需要下载支付宝的SKD,然后打开进入目录openssl下面的bin文件夹里面然后打开终端 进入该目录下面,然后输入命令// 生成私钥
生成私钥:openssl genrsa -out privatekey.key 1024 (privately.key 是生成的文件,后缀是key)接着命令:openssl pkcs8 -topk8 -inform PEM -in privatekey.key -outform PEM -nocrypt(确定后在终端上面会有一大串字符,这个字符就是项目中运用的私钥)//
生成公钥 对应公钥:openssl rsa -in privatekey.key -pubout -out pubkey.key (这个pubkey.key文件就是公钥,如果不能打开,修改后缀为text,公钥还要交给服务端,服务端和支付宝还要进行订单状态的查询还有支付结果的通知)公钥和私钥的生成后就开始上代码1 在info.plist文件中 NSAppTransportSecurity选项下面只有一个bool参数 NSAllowsArbitraryLoads YES (这样子是为了ios9的https的请求方式)
2 在项目中要倒入demo中的Alipay文件夹下面的内容(这个是你请求过程中需要的参数,里面的Order文件就是清单的详细内容,里面包含所有的订单内容,其中的订单号是调用服务端接口的返回值)
下面是方法外加参数
// 密钥 NSString* privateKey = PRIVATEKEY;
// 支付宝支付 Order* order = [[Order alloc]init];
// 合作者id order.partner = PID;
// 卖家账号 order.seller = @"piaojiaowang@163.com";
// 订单号 order.tradeNO = @"4";
// 产品名称 order.productName = @"票交网1";
// 产品描述 order.productDescription = @"票据信息";
// 产品价格 order.amount = [NSString stringWithFormat:@"0.1"];
// 回调的url order.notifyURL = @"www.piaojiaowang.com.cn";
// 支付的方式 order.service = @"mobile.securitypay.pay";
// 支付类型。默认值为:1(商 品购买) order.paymentType = @"1";
// 商户网站使用的编码格式,固 定为 utf-8 order.inputCharset = @"utf-8";
// 未付款交 易的超时 时间 order.itBPay = @"30m"; // 应用注册scheme,在AlixPayDemo-Info.plist定义URL types NSString *appScheme = @"piaojiaowangAlipayDemo";
//将商品信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@"orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncode id 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) {
//【callback 处理支付结果】
NSLog(@"reslut = %@",resultDic);
if ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000) {
NSLog(@"支付完成");
hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.labelText = @"支付完成";
[hud hide:YES afterDelay:2];
}else if ([[resultDic objectForKeyedSubscript:@"resultStatus"] intValue] == 4000){
NSLog(@"订单支付失败");
hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.labelText = @"支付失败";
[hud hide:YES afterDelay:2];
}else{
NSLog(@"网络连接出错");
hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.labelText = @"网络连接出错";
[hud hide:YES afterDelay:2];
}
}];
}
3 APPDelegate
// 支付宝支付
-(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"]) {
[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary*resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户 app 在后台很可能被系统 kill 了, 所以 pay 接口的 callback 就会失效,请商户对 standbyCallback 返回的回调结果进行处理,就是在这个方法里面处理跟 callback 一样的逻辑】
NSLog(@"result = %@",resultDic);
}];
}
return [UMSocialSnsService handleOpenURL:url];
}