接近年关,公司产品提出新需求,和支付宝合作,需要开发快捷登录--》“无线账户授权”,手机端装有支付宝钱包,直接唤起支付宝钱包,若没有支付宝钱包就直接走HTML5页面操作,该操作也是内嵌在Alipay SDK 中,首先说无线账户授权。
支付宝提供的文档里有涉及客户端:iOS/ Android /服务端( JAVA PHP C#),对于只用其中一部分内容的伙伴来说比较杂乱,于是把其中涉及iOS+c#部分提取出来,这样看清晰一些。
流程:
1、商户客户端根据支付宝授权定义的参数规范组装请求信息,调用支付宝SDK授权接口;
2、支付宝SDK唤起支付宝钱包(8.3及以上版本才支持)或者H5页面,进行授权登录;
3、支付宝SDK请求支付宝服务端,获取授权结果;
4、支付宝SDK将获取到的授权结果同步返回给商户客户端;
其中要区分清楚角色:手机用户、商户客户端(IOS App)、 商户服务端(c#)、 支付宝SDK 、支付宝服务端
流程图如下:
一、接入前期准备:
1、下载包
WS_MOBILE_PAY_SDK_BASEandLogin.zip
2、下载接口
https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/toSdk.htm
3、打开XCODE ,把压缩包中的 AlipaySDK.bundle、 AlipaySDK.framework 导入到项目文件(need copy)
#import <AlipaySDK/AlipaySDK.h>
NSString *partner = @"";(合作者身份以2088开头的纯15位数字)
NSString *appID = @""; (商户签约的 appid)
NSString *privateKey = @""; (商户端生成的私钥PKCS8格式)
调用 AlipaySDK API授权 ,授权demo参考如下
签名:支付宝提供的demo中有签名以及验签机制(DataSigner、DataVerfiry等):RSA 、 MD5签名,貌似只需关心RSA签名, 安全起见将支付宝中涉及到 商户私钥privatekey 、支付宝公钥(固定不变的)保存在服务端(c#),服务端用私钥将authStr(授权认证字符串)进行签名,返回给客户端(ios app),然后客户端将authStr(未签名)、signString(authStr对应的RSA签名格式)、签名类型RSA 三个合并起来,调用快捷登录API
所以
这个客户端不用处理直接从服务端拿过来就ok
5、若手机端装有 “支付宝钱包app” ,API接口调用成功之后会返回url,
6、在 AppDelegate的
- (BOOL)application:(UIApplication )applicationopenURL:(NSURL )url sourceApplication:(NSString *)sourceApplicationannotation:(id)annotation
调用回传方法如下:
7、使用上面获取到的 authCode(授权码),调用授权令牌接口(alipay.system.oauth.token)换取access_token,access_token有效期为180天。
二、授权令牌接口:由于我们自己服务端是ASP.NET(C#)
授权令牌接口:AlipaySystemOauthTokenRequestAlipaySystemOauthTokenResponse
用户信息共享接口:AlipayUserUserinfoShareRequestAlipayUserUserinfoShareResponse
1、授权令牌接口(alipay.system.oauth.token)SDK集成
ASP.NET(C#)配置流程
-
步骤1: 导入类包
解压“alipay-sdk-NEXXX.zip”,除了AopSdk.csproj、AopSdk.sln外其他所有类文件原封不动地放置到商户的项目中。
-
步骤2: 调用类包
请求示例
商户服务端请求支付宝系统,请求示例如下:
using Aop.Api;//支付宝网关地址
string serverUrl = "https://openapi.alipay.com/gateway.do";//应用ID
string appId = "2014******14150";
//客户端返回的auth_code string auth_code = "4b6f9f6d560345398c9b3cae18b96C09";
//返回结果格式:xml、json; string format = "json"; //商户私钥 string privateKey = "商户私钥文件路径";//字符集格式
string charset = " utf-8";
AlipaySystemOauthTokenRequest
AlipaySystemOauthTokenRequest();
req.Code = auth_code;
req.GrantType = "authorization_code";
IAopClient client = new DefaultAopClient(serverUrl, appId, privateKey,
format, charset);
AlipaySystemOauthTokenResponse res = client.Execute(req);Response.Write("code:"+res.Code()+" ");Response.Write("msg:"+res.Msg());
三: 用户信息共享接口(alipay.user.userinfo.share)SDK集成
ASP.NET(C#)配置流程
-
步骤1: 导入类包
解压“alipay-sdk-NEXXX.zip”,除了AopSdk.csproj、AopSdk.sln外其他所有类文件原封不动地放置到商户的项目中。
-
步骤2: 调用类包
请求示例商户系统请求支付宝系统,请求示例如下。
using Aop.Api;//支付宝网关地址
string serverUrl = "https://openapi.alipay.com/gateway.do";//应用ID string appId = "2014******14150";
// alipay.system.oauth.token返回的access_token string access_token = "kuaijieB0b15a0d0c3ff4510a21e5556d5a8cX09";
//默认值 String prodCode ="WAP_FAST_LOGIN";//返回结果格式:xml、json; string format = "json"; //商户私钥 string privateKey = "商户私钥文件路径";//字符集格式 string charset = " utf-8";AlipayUserUserinfoShareRequest
AlipayUserUserinfoShareRequest(); req. SetProdCode(prodCode); IAopClient client = new DefaultAopClient(serverUrl, appId, privateKey,
format, charset); AlipayUserUserinfoShareResponse res = client.Execute(req,
access_token);
Response.Write("code:"+res.Code()+" ");
Response.Write("msg:"+res.Msg());
返回值在返回结果对象res 内,自行解析。
服务端(c#)获取到用户信息之后,返回给iOS客户端,客户端再进行相应逻辑处理。
步骤1: 使用签约支付宝账号登录支付宝网站,点击“签约管理”栏目下的“签约订单”。
步骤2: 在跳转后的页面中点击“查看PID | KEY”,在新打开的页面中(https://b.alipay.com/order/pidAndKey.htm),可查看到签约支付宝账号、合作者身份ID(PID)。
开放平台密钥管理内的 Appid即商户调用接口需要用到的APPID。
1. 打开openssl密钥生成软件
打开 openssl文件夹下的bin文件夹,执行openssl.exe文件,如下图:
输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前bin文件目录中会新增一个rsa_private_key.pem文件,其文件为原始的商户私钥,以下为命令正确执行截图:
输入“rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem”命令回车后,在当前bin文件目录中会新增一个rsa_public_key.pem文件,其文件为原始的商户公钥,以下为命令正确执行截图:(RSA公钥需要上传到支付宝平台,去掉空格,换行,做一行上传)
4. 生成PKCS8编码的私钥
输入命令“pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM-nocrypt”并回车,当前界面中会直接显示出生成结果:
右键点击 openssl窗口上边边缘,选择“编辑→标记”,之后选中要复制的文字:
此时继续右键点击 openssl窗口上边边缘,选择“编辑→复制”,把复制的内容粘贴进一个新的记事本中,可随意命名,只要知道这个是PKCS8格式的私钥即可(请妥善保存该文件)。
六、RSA密钥使用逻辑
商户在使用 RSA签名方式的支付宝接口时,真正会用到的密钥是商户私钥与支付宝公钥。商户上传生成的商户公钥给支付宝,支付宝把支付宝公钥给商户,是公钥互换的操作。这就使得商户使用自己的私钥做签名时,支付宝端会根据商户上传的公钥做验证签名。商户使用支付宝公钥做验证签名时,同理,也是因为支付宝用支付宝私钥做了签名。
(C#)开发语言使用密钥对方法
商户的私钥
刚刚用命令行生成的PKCS8格式私钥
–必须保证只有一行文字,即:没有回车、换行、空格等;–需对刚生成的(原始的)私钥做pkcs8编码;
– 编码完成后,复制该段私钥,并去掉该段里面的回车、换行、空格、 “-----BEGIN RSA PRIVATE KEY-----”、 “-----END RSA PRIVATE KEY-----”。
支付宝RSA公钥固定值
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB
-----END PUBLIC KEY-----
去掉这串字符串中的回车、换行、空格,必须保证只有一行文字。
接下来介绍接口使用中注意事项:
1、拼接authStr(认证授权信息)需用 key=”value”&key=”value” 格式,之后将authStr进行RSA签名(c#端处理),最终拼接为
“authStr(未签名字符串)&sign=”已签字符串”&sign_type=”RSA””最后作为参数传入SDK的授权方法 ,方法原型
-(void) auth_V2WithInfo:(NSString*)infoStr fromScheme(NSString*)schemeStr callback:(CompletionBlock)completionBlock;//通过参数调用登录授权接口。
参数:
infoStr就是上面一---》4、demo中的signStr
shemeStr:与商户app在info.plist中的URL Schemes保持一致,保证跳转支付宝客户端授权后能正确唤起商户app。 例如
completionBlock 授权结果回调:
resultStatus:9000——认证成功 4000——认证失败 6001——用户取消
-(void)processAuth_V2Result:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock; //授权结束后在appdelegate中需处理的方法
当设备安装了支付宝客户端,会优先跳转支付宝客户端进入授权,返回的url传入该方法处理完成后统一输出结果。
参数:
resultUrl //支付宝客户端授权完成或者取消,传回给商户app的url。
completionBlock //授权结果回调,当支付宝客户端操作过程中,如果商户app进程在后台被结束拿不到之前的block,就会通过这个block输出结果。
备注:
该方法在AppDelegate中的- (BOOL)application:(UIApplication *)applicationopenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplicationannotation:(id)annotation进行调用.
客户端授权登录规则
手机上安装了支付宝钱包
用户在手机上安装支付宝钱包 8.3或者以上版本时,登录授权SDK将会跳转到支付宝钱包中完成登录授权。
手机上没有安装支付宝钱包
用户在手机上没有安装支付宝钱包8.3或者以上版本时,登录授权SDK将打开H5页面提供登录授权服务。
登录授权参数列表含义说明:
同步返回参数说明
含义
支付宝服务端对提供的请求数据进行处理后,返回给客户端结果数据,商户从支付宝登录授权SDK中获取结果数据后,根据这些数据进一步处理。
resultStatus={9000};memo={处理成功};result={apiname="com.alipay.account.auth"&app_id="2013081700024223"&app_name="mc"&auth_type="AUTHACCOUNT"&biz_type="openservice"&pid="2088102123816631"&product_id="WAP_FAST_LOGIN"&scope="kuaijie"&target_id="kkkkk091125"&sign_date="2015-01-1323:36:06"&success="true"&alipay_open_id="n5GOjNEVJ6SHdIUdIYhUpOZ8ytQ+iRYtNBJE6dziGb-Ift5cVHir3t8oMoWz7njq01"&auth_code="d9d1b5acc26e461dbfcb6974c8ff5E64"&result_code="200"&sign_type="RSA"&sign="MCwCFByGPh3kQK5KuT7ljiugGpTe0Jc4AhQr+YMaHGxGEIhCQiDMjGayRk2xag=="}
附录
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)