• .NET轻松实现支付宝服务窗网页授权并获取用户相关信息


    前言:

    最近在开发一个商业街区的聚合扫码支付功能,其中需要用到的有支付宝,微信两种支付方式,当然对于开发微信支付而已作为自己的老本行已经比较熟悉了,然而对于我来说支付宝支付还是头一次涉及到。这次项目中需要用到的是支付宝公众号支付这一功能,因为需要进行支付宝授权获取到用户的User_ID然后在进行支付宝公众号支付,在这里我就顺带把用户信息也获取了。因为第一次玩,大概配置支付宝开发平台的应用信息到获取到用户User_ID遇到了几个坑,今天记录一下希望能够帮助一下没有做个这样方面的同仁哪些的方有坑,并且加深一下自己的印象,最后我要声明一下我所开发语言是.net mvc 非JAVA,因为这里java和非java的秘钥生成的秘钥格式有所不同。

    第一步:登录支付宝开放平台,注册开发者,创建应用添加所需功能和配置应用信息

    登录地址

    • https://openhome.alipay.com/

    创建应用

    点击开发者中心>创建一个应用>获取拿到对应应用的appid(后期程序中会用到)。

    添加对应功能

    因为我在这里只需要使用到获取会员信息授权的功能,所以添加(获取会员信息的功能即可),如下图所示:

    图片

    图片

    应用信息配置,这里最为主要的还是RSA(SHA256)密钥生成,有坑需注意:

    在应用信息配置的时候我们需要配置:应用网关(没有时不需要配置),授权回调地址,加签方式(RSA(SHA256)密钥)

    这里主要讲的是RSA(SHA256秘钥生成):在这里首先我们下载秘钥生成工具使用这个最后,可视化(window系统的用户)

    • 下载地址:https://docs.open.alipay.com/291/105971

    下载完成后我们需要打开工具,这里还要强调一下因为我是.Net MVC,所以我们要选择的Rsa秘钥格式为:PKCS1(非Java适用),秘钥长度选择2048(因为支付宝配置所需的是RSA256,假如是RSA的话适用1024即可),如下图所示:

    图片

    第二步:适用.Net MVC 实现支付宝网页授权代码

    了解支付宝授权的流程

    图片

    如上图所示,需要拿取到用户信息需要分四步走:

    • 1、拼接授权回调地址

    • 2、获取Auth_Code(授权码)

    • 3、通过Auth_Code换取接口access_token及其用户user_id

    • 4、调用接口获取用户信息

    Alipay SDK(通用版)

    通用版服务端 SDK 适用于 Java、PHP、C#、Python、Node.js 编程语言,可调用所有 OpenAPI 接口。

    • 下载地址:https://opendocs.alipay.com/open/54/103419

    代码实现

    业务逻辑实现:

    1. #region 支付宝网页授权获取userid
    2. /// <summary>
    3. ///支付宝授权登录
    4. /// </summary>
    5. /// <param name="Sid">店铺编号</param>
    6. /// <returns></returns>
    7. public ActionResult SupplierAliPay()
    8. {
    9. try
    10. {
    11. string ReturnUrl = "";//第一步:获取auth_code接口拼接
    12. var admins = new admins { Id = 1 }.SelectObject();
    13. string AliRedirect_url ="获取回调地址";//http请求格式必须与公众平台配置的一致
    14. //注意假如你需要获取到用户的新的的话SCOPe类型使用auth_userinfo,而我在支付那里使用的是auth_base这样不需要用户授权,可以让用户丝毫没有感觉,体验性好
    15. ReturnUrl = "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=" +应用APPid+ "&scope=auth_base&state=" + 自定义参数(非必填)+ "&redirect_uri=" + Url.Encode(AliRedirect_url) + "";return Redirect(ReturnUrl);
    16. }
    17. catch (Exception ex)
    18. {
    19. return View();
    20. }
    21. }
    22. /// <summary>
    23. ///获取用户buyer_id调转AliPaypage获取支付宝账号的userid (授权回调)
    24. /// </summary>
    25. /// <param name="auth_code"></param>
    26. /// <param name="state"></param>
    27. /// <returns></returns>
    28. public  ActionResult GetUserAliUserID(string auth_codestring state)
    29. {
    30. try
    31. {
    32. auth_code= Request.QueryString["auth_code"];//授权码
    33. state = Request.QueryString["state"];string AliAppid="";//支付宝应用Appid
    34. string Userid = "";//支付宝用户唯一编号//应用私钥
    35. string YOUR_PRIVATE_KEY= "";
    36. //支付宝公钥
    37. string ALIPAY_PUBLIC_KEY = "";
    38.                     
    39.  Aop.Api.IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do",AliAppid, YOUR_PRIVATE_KEY"json""1.0""RSA2", ALIPAY_PUBLIC_KEY"GBK"false);
    40. //获取access_token
    41. AlipaySystemOauthTokenRequest requestAccess_token = new AlipaySystemOauthTokenRequest();
    42. requestAccess_token.GrantType = "authorization_code";
    43. requestAccess_token.Code = auth_code;
    44. AlipaySystemOauthTokenResponse responseAccess_token = client.Execute(requestAccess_token);
    45. Userid = responseAccess_token.UserId;//支付宝用户的唯一userId //responseAccess_token.AlipayUserId;用户的open_id( 已废弃,请勿使用 )  //获取用户信息,通过access_token调用用户信息共享接口获取用户信息  AlipayUserInfoShareRequest requestUserinfo = new AlipayUserInfoShareRequest();  AlipayUserInfoShareResponse responseUserinfo = client.Execute(requestUserinfo, responseAccess_token.AccessToken);  string UserName = responseUserinfo.NickName;//昵称  string Address = responseUserinfo.City;//所属城市  string UserImage= responseUserinfo.Avatar;//用户头像  string gender = responseUserinfo.Gender;//M为男性,F为女性, 如果没有数据的时候不会返回该数据,请做好容错return Redirect("/mobile_user/HstyAliPayPayment/AliPayPage?Sid="+Sid+ "&buyer_id="+Userid+"");
    46. }
    47. catch (Exception ex)
    48. {
    49. return view();
    50. }
    51. }
    52. #endregion
  • 相关阅读:
    leetcode做题笔记168. Excel表列名称
    ArrayList和LinkedList的区别,以及应用场景
    神经网络参数研究方法,神经网络参数研究方向
    生成验证码
    被迫开始学习Typescript —— class
    VB遍历所有窗体名
    使用GPU加速的显着性对象检测评估技术详解 - MAE、Max F-measure、S-measure与E-measure的实践应用
    等保: Postgresql配置ssl链接
    乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建
    快速入门Docker
  • 原文地址:https://blog.csdn.net/qq_37237487/article/details/134277550