注意点:
1.添加URL Types 中添加
2.添加白名单 ,要不就调不到支付宝中
//过程
#warning 1.生成预支付订单信息
要获得partner seller 私钥 这些东西为了保证安全,最好存到服务端.
appScheme,, notifyURL 处理
#warning 2.将订单信息用私钥进行签名
订单的生成也最好在服务端生成
#warning 3.调用支付宝SDK发送请求数据
有两个同步,异步通知..两个通知的处理方式相同.(应用程序跳转到支付宝后,我们的程序很可能会被系统kill掉.所以有两个通知)
#warning 4.对支付回调的结果进行验证(这一步加上是确保数据的安全,不加不影响支付)
回调的验证如下(支付宝demol中没有)
私钥 进行签名
返回的结果需要用公钥进行验证
//支付状态验证 用SBJson
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
// 用SBJSON 或者 JSONKit 将回调信息(字典)转成字符串
SBJSON *sbJson = [[SBJSON alloc] init];
NSString *resultDicToString = [sbJson stringWithObject:resultDic error:nil];
[self paymentResult:resultDicToString];
NSLog(@"回调结果reslut = %@",resultDic);
// 用SBJSON 或者 JSONKit 将回调信息(字典)转成字符串
SBJSON *sbJson = [[SBJSON alloc] init];
NSString *resultDicToString = [sbJson stringWithObject:resultDic error:nil];
[self paymentResult:resultDicToString];
NSLog(@"回调结果reslut = %@",resultDic);
// NSLog(@"%d%@", [[resultDic objectForKey:@"resultStatus"] intValue], [resultDic objectForKey:@"memo"]);
}];
- (void)paymentResult:(NSString *)resultDicToString
{
//结果处理
AlixPayResult *result = [[AlixPayResult alloc] initWithString:resultDicToString];
if (result)
{
/**
* 状态码
* 9000 订单支付成功
* 8000 正在处理中
* 4000 订单支付失败
* 6001 用户中途取消
* 6002 网络连接出错
*/
if (result.statusCode == 9000)
{
/**
*用公钥验证签名 严格验证请使用result.resultString与result.signString验签
*/
// 交易成功
NSString* key = AlipayPublicKey;
id<DataVerifier> verifier;
verifier = CreateRSADataVerifier(key);
// 参数1:订单信息
// 参数2:签名值
/**< resultString.订单信息以及验证签名信息*/
/*如果你不想做签名验证,那这个字段可以忽略了*/
if ([verifier verifyString:result.resultString withSign:result.signString])
{
// 验证签名成功,交易结果无篡改
NSLog(@"支付成功!");
} else {
NSLog(@"此单被篡改无效!!");
}
}
else
{
// 支付失败
NSLog(@"%d%@", result.statusCode, result.statusMessage);
}
}
else
{
// 支付失败
NSLog(@"支付失败!");
}
//结果处理
AlixPayResult *result = [[AlixPayResult alloc] initWithString:resultDicToString];
if (result)
{
/**
* 状态码
* 9000 订单支付成功
* 8000 正在处理中
* 4000 订单支付失败
* 6001 用户中途取消
* 6002 网络连接出错
*/
if (result.statusCode == 9000)
{
/**
*用公钥验证签名 严格验证请使用result.resultString与result.signString验签
*/
// 交易成功
NSString* key = AlipayPublicKey;
id<DataVerifier> verifier;
verifier = CreateRSADataVerifier(key);
// 参数1:订单信息
// 参数2:签名值
/**< resultString.订单信息以及验证签名信息*/
/*如果你不想做签名验证,那这个字段可以忽略了*/
if ([verifier verifyString:result.resultString withSign:result.signString])
{
// 验证签名成功,交易结果无篡改
NSLog(@"支付成功!");
} else {
NSLog(@"此单被篡改无效!!");
}
}
else
{
// 支付失败
NSLog(@"%d%@", result.statusCode, result.statusMessage);
}
}
else
{
// 支付失败
NSLog(@"支付失败!");
}
}
3.测试点
返回结果需要通过 resultStatus 以及 result 字段的值来综合判断并确定支付结果。 在 resultStatus=9000,并且 success="true"以及 sign="xxx"校验通过的情况下,证 明支付成功。其它情况归为失败。较低安全级别的场合,也可以只通过检查 resultStatus 以及 success="true"来判定支付结果。以下为订单支付成功的完成信 息示例:
ResultStatus={9000};memo={};result={partner="2088101568358171"&seller_id= "xxx@alipay.com"&out_trade_no="0819145412-6177"&subject=" 测 试 "&body=" 测 试
测试
"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service=" mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay= "30m"&success="true"&sign_type="RSA"&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPs ly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZ gSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="}