前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >支付-支付宝

支付-支付宝

作者头像
進无尽
发布2018-09-12 18:41:37
2K0
发布2018-09-12 18:41:37
举报
文章被收录于专栏:進无尽的文章進无尽的文章

前言

支付宝支付是很常见的支付方式,下面这篇就是亲测有用的文章,纯手打,会持续更新。


 卖家跟支付宝签约

  (需要实名认证这个支付宝账号,需要提供企业资料,成为企业支付宝账号,一般为公司的支付宝账号)

第一步:登陆支付宝官方网站(支付宝商家中心)。

      这是没有签约的账户效果

      以下是申请好了的效果图,(申请好套餐后正常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,订单信息,以及签名验证信息。如果你不想做签名验证,那这个字段可以忽略了。。

集成支付宝iOS

*****************************更新 **************************

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里就会有内容返回了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.04.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  •  卖家跟支付宝签约
  • 生成公钥和私钥,并上传公钥里的字符串
  •   项目集成支付宝SDK
    • iOS9上面不能跳转到支付宝客户端支付 什么情况只能跳到网页
      • 支付结果不回调
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档