apicloud apicloud

注册
查看: 13|回复: 0
打印 上一主题 下一主题

[ 其他 ] tp5集成支付宝获取会员信息为apicloud开接口案例

入门司机

UID:22693

主题:
32
帖子:
353
云币:
1182


第零步:了解服务器端和apicloud端所需的东西和我们最终会拿到的数据
首先我们先看一下支付宝的文档,https://docs.open.alipay.com/284,支付宝会给我们以下的信息


其次:我们在APICloud里面需要用到支付宝模块,aliPayPlus,模块地址:https://docs.apicloud.com/Client-API/Open-SDK/aliPayPlus


第一步:? ?注册支付宝开放平台金沙伟德网址者和注册应用并上线
? ?? ?? ???之前写过文档:支付宝开放平台认证金沙伟德网址者流程

第二步:下载服务器端集成SDK
? ?? ?下载服务器端SDK地址:https://docs.open.alipay.com/54/103419
? ?有java版本、.NET、php、python、NodeJs??五种语言,大家自己选擅长的,我这里以php为例,并且集成到thinkphp5里面;

第三步:将下载的包解压,放到extend文件夹下面,以下图为例:

路劲注意,别搞错了。

第四步,我们服务器端操作,首先在文档里面引入支付宝服务端SDK
方法如图第三行代码所示:

然后在开放平台写的回调方法里面写代码如下:
  1. ? ?? ???$aop = DefaultAlipayClient();

  2. ? ?? ???$request = new\AlipaySystemOauthTokenRequest();
  3. ? ?? ???$request->setGrantType("authorization_code");
  4. ? ?? ???$request->setCode($code);
  5. ? ?? ???// $request->setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");
  6. ? ?? ???$result = $aop->execute($request);


  7. ? ?? ???// 获取用户信息

  8. ? ?? ???$accessToken = $result->alipay_system_oauth_token_response->access_token;

  9. ? ?? ???$request = new\AlipayUserInfoShareRequest ();
  10. ? ?? ???$result_user = $aop->execute ( $request , $accessToken );
复制代码

先放着,具体什么作用先不管,因为需要从移动端才能调用、

第五步:APP端的调用:
移动端集成模块,我们就先不说了,自己搞定我重点说方法、参数、调用和执行。

方法:我们直接用authDirect方法,地址如下:https://docs.apicloud.com/Client-API/Open-SDK/aliPayPlus#a5
在这方法里面,我们可以看到,模块作者在这里做了一个模糊的说明,只让去查看参数,但没有说参数怎么配置,我在这里吃过亏,我重点说一下authInfoStr参数的配置方法;


参数:参数配置的官方说明:https://docs.open.alipay.com/218/105327,具体如下图所示:

当时我看到这么多参数的心情是崩溃的,但是作为一名伟大的程序员,是要立志改变世界的,于是我,,,咳咳,跑题了,我们先回来说一下参数的配置,我从上往下看,发现都没有难点,一直到最后一步:sign,我是在是不明白最后一句话:整个授权参数信息的签名,即此行以上参数key和value通过&拼接的字符串的签名值,对此字符串签名后需做URL编码? ?[color=rgba(0, 0, 0, 0.65)]里面的对此字符串签名后做url编码,什么叫签名后?什么叫URL编码呢?
其中的坎坷我就不说了,直接说怎么做,把除了sign的其他字符串配置拼接好,如下所示:

apiname=com.alipay.account.auth&app_id=2018012802099382&app_name=mc&auth_type=AUTHACCOUNT&biz_type=openservice&method=alipay.open.auth.sdk.code.get&pid=2088921851532374&product_id=APP_FAST_LOGIN&scope=kuaijie&sign_type=RSA&target_id=alipaylogin100

在拿到这么一个字符串之后,接下来就是重要的一步了,进行sign值的获取,首先我们打开签名工具:



直接进入到签名选项,如1所示,把上面的字符串给2,把之前保存下来的私钥给3,然后看看你的开放平台式RSA 还是RSA2,,点击开始签名,会生成一个不知道是什么拼成的乱七八糟的字符串,会显示在4这个地方,我们拷贝下来,进行拼接,会如下所示:
apiname=com.alipay.account.auth&app_id=2018012802099382&app_name=mc&auth_type=AUTHACCOUNT&biz_type=openservice&method=alipay.open.auth.sdk.code.get&pid=2088921851532374&product_id=APP_FAST_LOGIN&scope=kuaijie&sign_type=RSA&target_id=alipaylogin100&sign=Z8OssdfsdP33aTZXGYgtgy9LP8rZS9PFyrRA/XnrUGJbMkaadsfsdf+xGPJio3Obdesu5Rxh/wRA0H6bHwB/SAJ2I8imLq3QgaPZiusdfsdfC8jAGep4ybEt4RtBlh+anXp5mPZGyMmFvjOtO3ESi/xVbqRcU5g/9nUith6WsMKwed7OpWqnT8/bvzNhsTzfvbCKQ/sdfsdsdfEom9ArtCyoWomNeQn42NEBrb+Tv6usdfsds/1JX6EjlJkmYddG5ugtwhEdpE3ESRX+BRQdsfsdfdsfabQz/AaqPpK/FwEku+FWyuR97dbJGVr6oLwoD6AYZk7/8WoO6EgIarTYJXmJptkYieGbWG0zQ==

就得到了这么一个字符串,在拿到这个字符串之后,参数部分完结。

调用和执行:我们在js文件里面写到:

  1. ? ? var aliPayPlus = api.require('aliPayPlus');
  2. aliPayPlus.authDirect({
  3. authInfoStr: 'apiname=com.alipay.account.auth&app_id=2018012802099382&app_name=mc&auth_type=AUTHACCOUNT&biz_type=openservice&method=alipay.open.auth.sdk.code.get&pid=2088921851532374&product_id=APP_FAST_LOGIN&scope=kuaijie&sign_type=RSA&target_id=alipaylogin100&sign=Z8OssdfsdP33aTZXGYgtgy9LP8rZS9PFyrRA/XnrUGJbMkaadsfsdf+xGPJio3Obdesu5Rxh/wRA0H6bHwB/SAJ2I8imLq3QgaPZiusdfsdfC8jAGep4ybEt4RtBlh+anXp5mPZGyMmFvjOtO3ESi/xVbqRcU5g/9nUith6WsMKwed7OpWqnT8/bvzNhsTzfvbCKQ/sdfsdsdfEom9ArtCyoWomNeQn42NEBrb+Tv6usdfsds/1JX6EjlJkmYddG5ugtwhEdpE3ESRX+BRQdsfsdfdsfabQz/AaqPpK/FwEku+FWyuR97dbJGVr6oLwoD6AYZk7/8WoO6EgIarTYJXmJptkYieGbWG0zQ=='
  4. }, function(ret, err) {
  5. if (ret && ret.resultStatus == 9000 && ret.result.length > 0) {
  6. alert('授权成功,请点击确认进行登录');
  7. var code = ret.result.match(/auth_code=(\S*)&scope/)[1];
  8. getaliPayUserinfo(code);
  9. } else {
  10. alert('授权失败,请重新进行授权');
  11. }
  12. });
复制代码
然后在页面写一个方法调用测试,如果不出问题的话会跟我一样,如下图所示


ok,到这里就执行的差不多了,当我们点击确认授权只有,移动端 会给我们返回一串字符串,如下样式所示:
??resultStatus=9000? ???memo="处理成功"? ???result="success=true&auth_code=d9d1b5acc26e461dbfcb6974c8ff5E64&result_code=200 &user_id=2088003646494707"
那么这里面有一个auth_code很重要,服务器端谁也不看,就看他,这个auth_code只能使用一次,而且时限只有一天,也就是说最快就是你用一次就没用失效了,最长也就是一天一换。。
那么我们拿到他之后该怎么做呢,很简单,把该参数传递给回调函数,剩下的我们在回调函数里面执行即可。
apicloud代码如图所示:

  1. ? ? api.ajax({
  2. ? ?? ???url: 回调地址,
  3. ? ?? ???method: 'post',
  4. ? ?? ???data: {
  5. ? ?? ?? ?? ?values: {
  6. auth_code: auth_code??//上面说的auth_code参数
  7. ? ?? ?? ?? ?}
  8. ? ?? ???}
  9. ? ? }, function(ret, err) {
  10. ? ?? ???if (ret) {
  11. ? ?? ?? ?? ?// console.log( JSON.stringify( ret ) );
  12. ? ?? ?? ?? ?if (ret.code == 101) {
  13. ? ?? ?? ?? ?? ? // 信息获取成功
  14. ? ?? ?? ?? ?} else if (ret.code == 102) {
  15. ? ?? ?? ?? ?? ? // 信息获取失败
  16. ? ?? ?? ?? ?} else if (ret.code == 103) {
  17. ? ?? ?? ?? ?? ? // auth_code丢失,请重新获取
  18. ? ?? ?? ?? ?} else {
  19. ? ?? ?? ?? ?? ? // 未知错误208801212945819
  20. ? ?? ?? ?? ?}
  21. ? ?? ???} else {
  22. ? ?? ?? ?? ?console.log(JSON.stringify(err));
  23. ? ?? ???}
  24. ? ? });
复制代码
服务器端代码所下:
  1. ? ?? ???$code = $_POST['auth_codecode'];

  2. ? ?? ???if(!isset($code)){
  3. ? ?? ?? ?? ?return ['code' => 103,'msg' => 'auth_code值为空','data' => $code];
  4. ? ?? ???}

  5. ? ?? ???$aop = DefaultAlipayClient();

  6. ? ?? ???$request = new\AlipaySystemOauthTokenRequest();
  7. ? ?? ???$request->setGrantType("authorization_code");
  8. ? ?? ???$request->setCode($code);
  9. ? ?? ???// $request->setRefreshToken("201208134b203fexxxx48bcabd8xxxda087a83b");
  10. ? ?? ???$result = $aop->execute($request);

  11. ? ?? ???$accessToken = $result->alipay_system_oauth_token_response->access_token;

  12. ? ?? ???$request = new\AlipayUserInfoShareRequest ();
  13. ? ?? ???$result_user = $aop->execute($request , $accessToken);

  14. ? ?? ???// dump($result_user->alipay_user_info_share_response->code);
  15. ? ?? ???// die;

  16. ? ?? ???if(!empty($result_user) && $result_user->alipay_user_info_share_response->code == 10000 ){

  17. ? ?? ?? ?? ?$result_acce = $result->alipay_system_oauth_token_response;
  18. ? ?? ?? ?? ?$result_user = $result_user->alipay_user_info_share_response;


  19. ? ?? ?? ?? ?$alipay_user_id = isset($result_acce->alipay_user_id) ? $result_acce->alipay_user_id : 100;
  20. ? ?? ?? ?? ?$user_id? ?? ???= isset($result_acce->user_id) ? $result_acce->user_id : 100;
  21. ? ?? ?? ?? ?$avatar? ?? ?? ?= isset($result_user->avatar) ? $result_user->avatar : 100;
  22. ? ?? ?? ?? ?$province? ?? ? = isset($result_user->province) ? $result_user->province : 100;
  23. ? ?? ?? ?? ?$city? ?? ?? ???= isset($result_user->city) ? $result_user->city : 100;
  24. ? ?? ?? ?? ?$nick_name? ?? ?= isset($result_user->nick_name) ? $result_user->nick_name : 100;
  25. ? ?? ?? ?? ?$student? ?? ???= isset($result_user->is_student_certified) ? $result_user->is_student_certified : 100;
  26. ? ?? ?? ?? ?$certified? ?= isset($result_user->is_certified) ? $result_user->is_certified : 100;
  27. ? ?? ?? ?? ?$gender? ?? ?? ?= isset($result_user->gender) ? $result_user->gender : 100;
  28. ? ?? ?? ?? ?$user_type? ?? ?= isset($result_user->user_type) ? $result_user->user_type : 100;
  29. ? ?? ?? ?? ?$user_status? ? = isset($result_user->user_status) ? $result_user->user_status : 100;


  30. ? ?? ?? ?? ?$data = [
  31. ? ?? ?? ?? ?? ? 'access_token'? ???=>? ? $result_acce->access_token,
  32. ? ?? ?? ?? ?? ? 'alipay_user_id'? ?=>? ? $alipay_user_id,
  33. ? ?? ?? ?? ?? ? 'refresh_token'? ? =>? ? $result_acce->refresh_token,
  34. ? ?? ?? ?? ?? ? 'user_id'? ?? ?? ? =>? ? $user_id,
  35. ? ?? ?? ?? ?? ? 'sign'? ?? ?? ?? ? =>? ? $result->sign,
  36. ? ?? ?? ?? ?? ? 'time'? ?? ?? ?? ? =>? ? time(),
  37. ? ?? ?? ?? ?? ? 'avatar'? ?? ?? ???=>? ? $avatar,
  38. ? ?? ?? ?? ?? ? 'province'? ?? ?? ?=>? ? $province,
  39. ? ?? ?? ?? ?? ? 'city'? ?? ?? ?? ? =>? ? $city,
  40. ? ?? ?? ?? ?? ? 'nick_name'? ?? ???=>? ? $nick_name,
  41. ? ?? ?? ?? ?? ? 'student'? ?? ?? ? =>? ? $student,
  42. ? ?? ?? ?? ?? ? 'certified'? ?? ???=>? ? $certified,
  43. ? ?? ?? ?? ?? ? 'gender'? ?? ?? ???=>? ? $gender,
  44. ? ?? ?? ?? ?? ? 'user_type'? ?? ???=>? ? $user_type,
  45. ? ?? ?? ?? ?? ? 'user_status'? ?? ?=>? ? $user_status
  46. ? ?? ?? ?? ?];

  47. ? ?? ?? ?? ?// 检查该用户是否注册
  48. ? ?? ?? ?? ?$checkUserRegiser = Db::name('alipay')->where('alipay_user_id',$data['alipay_user_id'])->find();
  49. ? ?? ?? ?? ?if($checkUserRegiser){
  50. ? ?? ?? ?? ?? ? $a = Db::name('alipay')->where('alipay_user_id',$data['alipay_user_id'])->update($data);
  51. ? ?? ?? ?? ?}else{
  52. ? ?? ?? ?? ?? ? $a = Db::name('alipay')->insert($data);
  53. ? ?? ?? ?? ?}
  54. ? ?? ?? ?? ?return ['code'=> 101,'data' => ['userid' => $data['user_id'],'data' => $data]];
  55. ? ?? ???} else {
  56. ? ?? ?? ?? ?return ['code'=> 102,'data' => $result];
  57. ? ?? ???}
复制代码
上面函数里面有一个DefaultAlipayClient方法,我做了封装放在了common.php里面,因为他比较重要,相当于是核心,所以放在了禁止执行文件里面,代码如下:
  1. function DefaultAlipayClient(){
  2. ? ? $aop = new\AopClient();
  3. ? ? $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
  4. ? ? $aop->appId = '你的APPID,在开放平台后获取';
  5. ? ? $aop->rsaPrivateKey = '你的应用私钥';
  6. ? ? $aop->alipayrsaPublicKey='支付宝公钥';
  7. ? ? $aop->apiVersion = '1.0';
  8. ? ? $aop->signType = 'RSA2';
  9. ? ? $aop->postCharset='utf-8';
  10. ? ? $aop->format='json';

  11. ? ? return $aop;
  12. }
复制代码




其实到目前为止,教程可以差不多结束了,在服务器端的代码里面,我连续调用了
[color=rgba(0, 0, 0, 0.65)]alipay.system.oauth.token---
[color=rgba(0, 0, 0, 0.65)]获取授权令牌接口方法和
[color=rgba(0, 0, 0, 0.65)]alipay.user.info.auth-----
[color=rgba(0, 0, 0, 0.65)]用户登录授权接口方法,并且把拿到的数据放到了数据库,因为当你的支付宝没有设置头像的时候,那么在返回的数据里面直接没有这个参数,所以我用php做了一个三目运算,。在查看代码的时候注意查看。

[color=rgba(0, 0, 0, 0.65)]

[color=rgba(0, 0, 0, 0.65)]

[color=rgba(0, 0, 0, 0.65)]具体学到这里,我也不知道该继续说点什么了,感觉这个流程已经走完了。我在第一次走这个流程的时候真的脑子都快炸了,已经忘了自己是怎么捣鼓过来的,但有一句话我想对大家说:当你遇到难题的时候,放宽心态,也许在你认为很难的问题的时候,也许就是临门一脚的事情,山不让路,我绕着走即可。

[color=rgba(0, 0, 0, 0.65)]

[color=rgba(0, 0, 0, 0.65)]谢谢大家,有问题可抛,希望本教程可以给大家有所帮助。

[color=rgba(0, 0, 0, 0.65)]

本帖子中包含更多资源????您需要 登录 才可以下载或查看,没有帐号?立即注册

本主题由 APICloud官方 于 昨天?09:19 审核通过
收藏收藏
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表