#pragma mark ==============点击订单模拟支付行为==============
//
//选中商品调用支付宝极简支付
//
- (void)doAlipayPay
{
//重要说明
//这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
//真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
//防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
/*============================================================================*/
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
NSString *appID =@"";
// 如下私钥,rsa2PrivateKey或者 rsaPrivateKey只需要填入一个
// 如果商户两个都设置了,优先使用 rsa2PrivateKey
// rsa2PrivateKey 可以保证商户交易在更加安全的环境下进行,建议使用 rsa2PrivateKey
// 获取 rsa2PrivateKey,建议使用支付宝提供的公私钥生成工具生成,
// 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
NSString *rsa2PrivateKey =@"";
NSString *rsaPrivateKey =@"";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//partner和seller获取失败,提示
if ([appIDlength] ==0 ||
([rsa2PrivateKey length] ==0 && [rsaPrivateKeylength] == 0))
{
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"提示"
message:@"缺少appId或者私钥。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
return;
}
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order* order = [Ordernew];
// NOTE: app_id设置
order.app_id = appID;
// NOTE: 支付接口名称
order.method =@"alipay.trade.app.pay";
// NOTE: 参数编码格式
order.charset =@"utf-8";
// NOTE: 当前时间点
NSDateFormatter* formatter = [NSDateFormatternew];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
order.timestamp = [formatterstringFromDate:[NSDatedate]];
// NOTE: 支付版本
order.version =@"1.0";
// NOTE: sign_type 根据商户设置的私钥来决定
order.sign_type = (rsa2PrivateKey.length >1)?@"RSA2":@"RSA";
// NOTE: 商品数据
order.biz_content = [BizContentnew];
order.biz_content.body =@"我是测试数据";
order.biz_content.subject =@"1";
order.biz_content.out_trade_no = [selfgenerateTradeNO];//订单ID(由商家自行制定)
order.biz_content.timeout_express =@"30m";//超时时间设置
order.biz_content.total_amount = [NSStringstringWithFormat:@"%.2f",0.01];//商品价格
//将商品信息拼接成字符串
NSString *orderInfo = [orderorderInfoEncoded:NO];
NSString *orderInfoEncoded = [orderorderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
// NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
// 需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString *signedString =nil;
RSADataSigner* signer = [[RSADataSigneralloc]initWithPrivateKey:((rsa2PrivateKey.length >1)?rsa2PrivateKey:rsaPrivateKey)];
if ((rsa2PrivateKey.length >1)) {
signedString = [signer signString:orderInfowithRSA2:YES];
} else {
signedString = [signer signString:orderInfowithRSA2:NO];
}
// NOTE: 如果加签成功,则继续执行支付
if (signedString !=nil) {
//应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString *appScheme =@"alisdkdemo";
// NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = [NSStringstringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
// NOTE: 调用支付结果开始支付
[[AlipaySDKdefaultService]payOrder:orderStringfromScheme:appSchemecallback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
NSString * str = [resultDicobjectForKey:@"resultStatus"];
if ([strisEqualToString:@"9000"])
{
[selfpaySuccess];
}
else
{
[selfpayError];
}
}];
}
}
#pragma mark -
#pragma mark ==============点击模拟授权行为==============
- (void)doAlipayAuth
{
//重要说明
//这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
//真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
//防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
/*============================================================================*/
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
NSString *pid =@"";
NSString *appID =@"";
// 如下私钥,rsa2PrivateKey或者 rsaPrivateKey只需要填入一个
// 如果商户两个都设置了,优先使用 rsa2PrivateKey
// rsa2PrivateKey 可以保证商户交易在更加安全的环境下进行,建议使用 rsa2PrivateKey
// 获取 rsa2PrivateKey,建议使用支付宝提供的公私钥生成工具生成,
// 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
NSString *rsa2PrivateKey =@"";
NSString *rsaPrivateKey =@"";
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//pid和appID获取失败,提示
if ([pidlength] ==0 ||
[appID length] ==0 ||
([rsa2PrivateKey length] ==0 && [rsaPrivateKeylength] == 0))
{
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"提示"
message:@"缺少pid或者appID或者私钥。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
return;
}
//生成 auth info对象
APAuthV2Info *authInfo = [APAuthV2Infonew];
authInfo.pid = pid;
authInfo.appID = appID;
//auth type
NSString *authType = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"authType"];
if (authType) {
authInfo.authType = authType;
}
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme =@"alisdkdemo";
// 将授权信息拼接成字符串
NSString *authInfoStr = [authInfodescription];
NSLog(@"authInfoStr = %@",authInfoStr);
// 获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString *signedString =nil;
RSADataSigner* signer = [[RSADataSigneralloc]initWithPrivateKey:((rsa2PrivateKey.length >1)?rsa2PrivateKey:rsaPrivateKey)];
if ((rsa2PrivateKey.length >1)) {
signedString = [signer signString:authInfoStrwithRSA2:YES];
} else {
signedString = [signer signString:authInfoStrwithRSA2:NO];
}
// 将签名成功字符串格式化为订单字符串,请严格按照该格式
if (signedString.length >0) {
authInfoStr = [NSStringstringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, ((rsa2PrivateKey.length >1)?@"RSA2":@"RSA")];
[[AlipaySDKdefaultService]auth_V2WithInfo:authInfoStr
fromScheme:appScheme
callback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
//解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode =nil;
if (result.length>0) {
NSArray *resultArr = [resultcomponentsSeparatedByString:@"&"];
for (NSString *subResultin resultArr) {
if (subResult.length >10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResultsubstringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.hostisEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processAuth_V2Result:urlstandbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode =nil;
if (result.length>0) {
NSArray *resultArr = [resultcomponentsSeparatedByString:@"&"];
for (NSString *subResultin resultArr) {
if (subResult.length >10 && [subResulthasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
returnYES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*,id> *)options
{
if ([url.hostisEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processAuth_V2Result:urlstandbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode =nil;
if (result.length>0) {
NSArray *resultArr = [resultcomponentsSeparatedByString:@"&"];
for (NSString *subResultin resultArr) {
if (subResult.length >10 && [subResulthasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
returnYES;
}