前言
支付宝支付是很常见的支付方式,下面这篇就是亲测有用的文章,纯手打,会持续更新。
卖家跟支付宝签约
(需要实名认证这个支付宝账号,需要提供企业资料,成为企业支付宝账号,一般为公司的支付宝账号)
第一步:登陆支付宝官方网站(支付宝商家中心)。
这是没有签约的账户效果
以下是申请好了的效果图,(申请好套餐后正常2-5天会有申请状态,成功后进入【我的商家服务】)
第二步:点击导航栏中“商家服务”,找到“合作身份(Partner ID)查询”与“安全校验码(key)查询”。
合作者身份ID(partner)和交易安全校验码(key)是商户与支付宝签约后,商户获得的支付宝商户唯一识别码与密钥。当商户把支付宝功能接入商户网站时会用到它们,以便让支付宝认证商户。 即可查询到合作者身份ID,以2088开头的16位纯数字。
生成公钥和私钥,并上传公钥里的字符串
怎么上传公钥呢?输入支付宝密码,跳转到查看交易安全校验码(key)页面,在那个页面设置下,打开公钥把公钥里面的字符串粘到指定位置并上传即可,公钥必须给支付宝,不然他们解密不了。打开终端,生成共私钥:
私钥:OpenSSL genrsa -out rsa_private_key.pem 1024
公钥:OpenSSL rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
编码后:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem
代码里需要使用 编码后的私钥进行加密,注意是编码后的。
(上传公钥)
(RSA秘钥)
项目集成支付宝SDK
下载支付宝SDK,把支付宝相关的SDK和依赖的系统库资源文件导入到本地工程项目中。
#define gxPartner @"2088*******" 商家的PID
#define gxSeller @"2000000000@qq.com" 收钱的支付宝账号
#define gxPrivateKey //商户方的私钥,pkcs8 格式。 @"MIICeAIBADANBgkqdasdasdasdasdasdoGBAM09Ym+y5Tzw/xVIdQ6xCZnpqh7ZUr-------"
+(void)PayMoney :(NSDictionary *)dataDic;{
/* *生成订单信息及签名 */ //将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = gxPartner;
//支付宝账号
order.seller = gxSeller;
//订单ID不能两次一样,否则第二次无法支付。
order.tradeNO = [dataDic objectForKey:@"fid"]; //订单ID(由商家自行制定)
order.orderNumber =[dataDic objectForKey:@"orderNumber"]; //订单号
order.productDescription = @"呵呵"; //商品描述
order.amount = [dataDic objectForKey:@"fpayMoney"]; //商品价格
order.notifyURL = @"http://www.xxx.com"; //回调URL
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com"; //应用注册scheme,在AlixPayDemo-Info.plist定义URL types`该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性`
NSString *appScheme = @"Mall"; > //将商品信息拼接成字符串 NSString *orderSpec = [order description]; DMLog(@"orderSpec = %@",orderSpec); > //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode idsigner = CreateRSADataSigner(gxPrivateKey);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
DMLog(@"reslut = %@",resultDic);
if ([[resultDic objectForKey:@"resultStatus"]isEqualToString:@"9000"]) {
//支付成功了
}
}];}}
resultStatus,状态码,SDK里没对应信息,第一个文档里有提到:支付成功后,后台的订单状态已经改变了,此时可以通知页面刷新,以后台的数据状态为准,更新前端页面中订单的支付状态。
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消
6002 网络连接出错
memo, 提示信息,比如状态码为6001时,memo就是“用户中途取消”。但千万别完全依赖这个信息,如果未安装支付宝app,采用网页支付时,取消时状态码是6001,但这个memo是空的。。(当我发现这个问题的时候,我就决定,对于这么不靠谱的SDK,还是尽量靠自己吧。。)
result,订单信息,以及签名验证信息。如果你不想做签名验证,那这个字段可以忽略了。。
*****************************更新 **************************
iOS9上面不能跳转到支付宝客户端支付 什么情况只能跳到网页
(一)为了适配 iOS9.0 中的 App Transport Security(ATS)对 http 的限制,这里需要对 支付宝的请求地址 alipay.com 做例外,在 app 对应的 info.list 中添加如下配置 (文中以 XML 格式描述)。
(二) 同时需要在Plist中设置支付宝为白名单
支付结果不回调
- (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);
}];
}
returnYES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options
{
if([url.hostisEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDKdefaultService]processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary*resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
returnYES;
}
你会发现 callback:^(NSDictionary *resultDic) 没有结果返回了,查了官网后发现,需要在APPDelegate里手动获取下返回结果,保持原支付代码不变的情况下,复制上面的代码粘贴到 APPDelegate里,支付密代码那里的回调callback里就会有内容返回了。