在蚂蚁开放平台注册申请应用上线

如果你只想看代码,直接跳至最后一步

申请过程就不多说了,申请完成后是 已上线 状态就ok了

下载支付宝开放平台开发助手,生成秘钥

点到生成密匙页面,根据自己需求选择密匙长度和密匙格式,再点击生成密匙即可,应用私匙和应用公匙一定要保存后,后面会用到

到支付宝开放平台的生活号 应用信息页面配置 密匙信息

配置接口加签方式,将刚才获取到的应用公匙填写进去,会返回给你支付宝公匙,将此公匙也好好保存,后面会用到

开始写代码,获取用户信息

接下来基本步骤如下图

拼接url,引导用户访问授权页面

拼接好的url:
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="你的appid"&scope=auth_user&redirect_uri=“你的业务页面回调地址”

参数 redirect_uri 需要注意的是,回调域名必须同开放平台设置域名一致

还有一个参数需要注意 scope ,这个参数有两个值,你可以根据你的需要来选择:

auth_base:以auth_base为scope发起的网页授权,是用来获取进入页面的用户的userId的,并且是***静默授权***并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面)。
auth_user:以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息。

获取auth_code

授权通过后,会跳转至你的回调页面,此时在你回调页面会添加几个参数,包括auth_code、app_id、scope等,可以通过将这些参数进行保存

获取auth_code
code = Request["auth_code"].ToString();

使用auth_code换取接口access_token及用户userId

注意:sign值获取在最下方代码中

接口 : https://openapi.alipay.com/gateway.do
请求方式:post
参数:

调用方式:(需要注意的是所有参数都必须先进行一下加密,加密方式由上方charset参数决定,这个参数写什么方式,那么你就需要用什么方式加密,我用的是utf-8)
示例:

        ali_appid = HttpUtility.UrlEncode(你的appid, Encoding.UTF8);string grant_type = HttpUtility.UrlEncode("authorization_code", Encoding.UTF8);  //值为authorization_code时,代表用code换取;值为refresh_token时,代表用refresh_token换取string charset = HttpUtility.UrlEncode("UTF-8", Encoding.UTF8);  //加密方式string code = HttpUtility.UrlEncode(auth_code, Encoding.UTF8); //上一步获取的auth_codestring method = HttpUtility.UrlEncode("alipay.system.oauth.token", Encoding.UTF8); //接口名称string sign_type = HttpUtility.UrlEncode("RSA2", Encoding.UTF8); //商户生成签名字符串所使用的签名算法类型string timestamp = HttpUtility.UrlEncode(填写当前时间, Encoding.UTF8); //当前时间 ,格式"yyyy-MM-dd HH:mm:ss"string version = HttpUtility.UrlEncode("1.0", Encoding.UTF8); //调用的接口版本,固定为:1.0signvalue = HttpUtility.UrlEncode(signvalue, Encoding.UTF8); //sign 这一步获取额外说明 //调用接口  string url = string.Format("https://openapi.alipay.com/gateway.do?app_id={0}&grant_type={1}&code={8}&charset={2}&method={3}&sign_type={4}&timestamp={5}&version={6}&sign={7}", ali_appid, grant_type, charset, method , sign_type, timestamp, version, signvalue,code);// 获取的值进行处理string result = HttpClientHelper.PostResponse(url);JObject outputObj = JObject.Parse(result);ali_accesstoken = outputObj["alipay_system_oauth_token_response"]["access_token"].ToString();ali_userid = outputObj["alipay_system_oauth_token_response"]["alipay_user_id"].ToString();

调用接口获取用户信息

接口 :https://openapi.alipay.com/gateway.do
请求方式:post
参数:

同上一步一样参数必须进行加密,上一步获取的sign值,这一步需要重新进行获取
接口调用示例

        ali_appid = HttpUtility.UrlEncode(你的appid, Encoding.UTF8);string grant_type = HttpUtility.UrlEncode("refresh_token", Encoding.UTF8);  //值为authorization_code时,代表用code换取;值为refresh_token时,代表用refresh_token换取string charset = HttpUtility.UrlEncode("UTF-8", Encoding.UTF8);  //加密方式string code = HttpUtility.UrlEncode(auth_code, Encoding.UTF8); //上一步获取的auth_codestring method = HttpUtility.UrlEncode("alipay.user.info.share", Encoding.UTF8); //接口名称string sign_type = HttpUtility.UrlEncode("RSA2", Encoding.UTF8); //商户生成签名字符串所使用的签名算法类型string timestamp = HttpUtility.UrlEncode(填写当前时间, Encoding.UTF8); //当前时间 ,格式"yyyy-MM-dd HH:mm:ss"string version = HttpUtility.UrlEncode("1.0", Encoding.UTF8); //调用的接口版本,固定为:1.0signvalue = HttpUtility.UrlEncode(signvalue, Encoding.UTF8); //sign 这一步获取额外说明 //调用接口  url = string.Format("https://openapi.alipay.com/gateway.do?app_id={0}&grant_type={1}&charset={2}&method={3}&sign_type={4}&timestamp={5}&version={6}&auth_token={8}&sign={7}", ali_appid, grant_type, charset, method, sign_type, timestamp, version, signvalue1,  ali_accesstoken);// 获取的值进行处理string result1 = HttpClientHelper.PostResponse(url);JObject outputObj1 = JObject.Parse(result1);nickname = outputObj1["alipay_user_info_share_response"]["nick_name"].ToString();sex = outputObj1["alipay_user_info_share_response"]["gender"].ToString();

整体代码编写(包括sign加密)

整体分为三块内容
1、sign加密
2、生活号获取相关信息
3、对前两的调用

对前两的调用

   //进入主页面先看下链接上有没有授权后的auth_code,有的话进行下一步获取token和userid,没有的话进行授权if (!string.IsNullOrEmpty(Request["auth_code"])){//将code进行保存在缓存中code = Request["auth_code"].ToString();Session["code"] = code;new alihandle().initial();//这一步是调用接口获取用户信息getoauth(); //这个函数你可以写,本页面其他逻辑处理}else{new alihandle().OpenAccess(); //进行授权操作}

生活号获取相关信息

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web;
using System.Text;
//命名空间根据自己业务逻辑修改
namespace JiaFeng_WebApp
{public class alihandle{public string ali_appid = "自己的appid";public string ali_private_key = "自己的私匙";public string auth_code = "";public string ali_accesstoken;public string ali_userid;public string nickname;public string sex;public string headimgurl;public string redirect_uri =“自己回调地址”;public alihandle(){}public void initial(){//授权后可获得auth_codeauth_code = HttpContext.Current.Request["auth_code"].ToString();//获取access_token  user_id var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //生成当前时间//sign 加密准备 ,需要这些参数进行加密AopDictionary txtParams = new AopDictionary();txtParams.Add("app_id", ali_appid);txtParams.Add("charset", "UTF-8");txtParams.Add("method", "alipay.system.oauth.token");txtParams.Add("sign_type", "RSA2");txtParams.Add("timestamp", time);txtParams.Add("version", "1.0");txtParams.Add("grant_type", "authorization_code");txtParams.Add("code", auth_code);IDictionary<string, string> sortedTxtParams = new SortedDictionary<string, string>(txtParams);txtParams = new AopDictionary(sortedTxtParams);//调用sign加密函数string signvalue = sign.SignAopRequest(txtParams, ali_private_key, "UTF-8", false, "RSA2");//sign 加密完成 //对每个参数进行utf_8加密ali_appid = HttpUtility.UrlEncode(ali_appid, Encoding.UTF8);string grant_type = HttpUtility.UrlEncode("authorization_code", Encoding.UTF8);string charset = HttpUtility.UrlEncode("UTF-8", Encoding.UTF8);string code = HttpUtility.UrlEncode(auth_code, Encoding.UTF8);string method = HttpUtility.UrlEncode("alipay.system.oauth.token", Encoding.UTF8);string sign_type = HttpUtility.UrlEncode("RSA2", Encoding.UTF8);string timestamp = HttpUtility.UrlEncode(time, Encoding.UTF8);string version = HttpUtility.UrlEncode("1.0", Encoding.UTF8);signvalue = HttpUtility.UrlEncode(signvalue, Encoding.UTF8);string url = string.Format("https://openapi.alipay.com/gateway.do?app_id={0}&grant_type={1}&code={8}&charset={2}&method={3}&sign_type={4}&timestamp={5}&version={6}&sign={7}", ali_appid, grant_type, charset, method , sign_type, timestamp, version, signvalue,code);//获取的想关信息,放入缓存string result = HttpClientHelper.PostResponse(url);JObject outputObj = JObject.Parse(result);ali_accesstoken = outputObj["alipay_system_oauth_token_response"]["access_token"].ToString();HttpContext.Current.Session["accesstoken"] = ali_accesstoken;ali_userid = outputObj["alipay_system_oauth_token_response"]["alipay_user_id"].ToString();HttpContext.Current.Session["openid"] = ali_userid;//获取用户信息time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //再次获取当前时间//参数进行sign加密AopDictionary txtParams1 = new AopDictionary();txtParams1.Add("app_id", ali_appid);txtParams1.Add("charset", "UTF-8");txtParams1.Add("sign_type", "RSA2");txtParams1.Add("timestamp", time);txtParams1.Add("version", "1.0");txtParams1.Add("method", "alipay.user.info.share");txtParams1.Add("grant_type", "refresh_token");txtParams1.Add("auth_token", ali_accesstoken);IDictionary<string, string> sortedTxtParams1 = new SortedDictionary<string, string>(txtParams1);txtParams1 = new AopDictionary(sortedTxtParams1);//调用sign加密函数string signvalue1 = sign.SignAopRequest(txtParams1, ali_private_key, "UTF-8", false, "RSA2");signvalue1 = HttpUtility.UrlEncode(signvalue1, Encoding.UTF8);//sign加密完成 //准备获取用户信息的参数,和上面参数值不一致的进行覆盖method = HttpUtility.UrlEncode("alipay.user.info.share", Encoding.UTF8);ali_accesstoken = HttpUtility.UrlEncode(ali_accesstoken, Encoding.UTF8);grant_type = HttpUtility.UrlEncode("refresh_token", Encoding.UTF8);url = string.Format("https://openapi.alipay.com/gateway.do?app_id={0}&grant_type={1}&charset={2}&method={3}&sign_type={4}&timestamp={5}&version={6}&auth_token={8}&sign={7}", ali_appid, grant_type, charset, method, sign_type, timestamp, version, signvalue1,  ali_accesstoken);//获取的用户信息进行处理string result1 = HttpClientHelper.PostResponse(url);JObject outputObj1 = JObject.Parse(result1);nickname = outputObj1["alipay_user_info_share_response"]["nick_name"].ToString();HttpContext.Current.Session["nickname"] = nickname;sex = outputObj1["alipay_user_info_share_response"]["gender"].ToString();HttpContext.Current.Session["sex"] = sex;headimgurl = outputObj1["alipay_user_info_share_response"]["avatar"].ToString();HttpContext.Current.Session["headimgurl"] = headimgurl;}//用户授权函数public void OpenAccess(){string url = string.Format("https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id={0}&scope=auth_user&redirect_uri={1}", ali_appid, redirect_uri);HttpContext.Current.Response.Redirect(url);}}
}

sign加密

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
//命名空间根据自己业务逻辑修改
namespace JiaFeng_WebApp
{public class sign{public static string SignAopRequest(IDictionary<string, string> parameters, string privateKeyPem, string charset, bool keyFromFile, string signType){return RSASign(parameters, privateKeyPem, charset, keyFromFile, signType);}public static string RSASign(IDictionary<string, string> parameters, string privateKeyPem, string charset, bool keyFromFile, string signType){string signContent = GetSignContent(parameters);return RSASignCharSet(signContent, privateKeyPem, charset, keyFromFile, signType);}public static IDictionary<string, T> CleanupDictionary<T>(IDictionary<string, T> dict){IDictionary<string, T> newDict = new Dictionary<string, T>(dict.Count);IEnumerator<KeyValuePair<string, T>> dem = dict.GetEnumerator();while (dem.MoveNext()){string name = dem.Current.Key;T value = dem.Current.Value;if (value != null){newDict.Add(name, value);}}return newDict;}public static string GetSignContent(IDictionary<string, string> parameters){// 第一步:把字典按Key的字母顺序排序IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();// 第二步:把所有参数名和参数值串在一起StringBuilder query = new StringBuilder("");while (dem.MoveNext()){string key = dem.Current.Key;string value = dem.Current.Value;if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value)){query.Append(key).Append("=").Append(value).Append("&");}}string content = query.ToString().Substring(0, query.Length - 1);return content;}public static string RSASignCharSet(string data, string privateKeyPem, string charset, bool keyFromFile, string signType){byte[] signatureBytes = null;RSACryptoServiceProvider rsaCsp = null;//字符串获取rsaCsp = LoadCertificateString(privateKeyPem, signType);byte[] dataBytes = null;if (string.IsNullOrEmpty(charset)){dataBytes = Encoding.UTF8.GetBytes(data);}else{dataBytes = Encoding.GetEncoding(charset).GetBytes(data);}if ("RSA2".Equals(signType)){signatureBytes = rsaCsp.SignData(dataBytes, "SHA256");}else{signatureBytes = rsaCsp.SignData(dataBytes, "SHA1");}return Convert.ToBase64String(signatureBytes);}private static RSACryptoServiceProvider LoadCertificateString(string strKey, string signType){byte[] data = null;//读取带//ata = Encoding.Default.GetBytes(strKey);data = Convert.FromBase64String(strKey);//data = GetPem("RSA PRIVATE KEY", data);try{RSACryptoServiceProvider rsa = DecodeRSAPrivateKey(data, signType);return rsa;}catch (Exception ex){//    throw new AopException("EncryptContent = woshihaoren,zheshiyigeceshi,wanerde", ex);}return null;}private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey, string signType){byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;// --------- Set up stream to decode the asn.1 encoded RSA private key ------MemoryStream mem = new MemoryStream(privkey);BinaryReader binr = new BinaryReader(mem);  //wrap Memory Stream with BinaryReader for easy readingbyte bt = 0;ushort twobytes = 0;int elems = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)binr.ReadByte();    //advance 1 byteelse if (twobytes == 0x8230)binr.ReadInt16();    //advance 2 byteselsereturn null;twobytes = binr.ReadUInt16();if (twobytes != 0x0102) //version numberreturn null;bt = binr.ReadByte();if (bt != 0x00)return null;//------ all private key components are Integer sequences ----elems = GetIntegerSize(binr);MODULUS = binr.ReadBytes(elems);elems = GetIntegerSize(binr);E = binr.ReadBytes(elems);elems = GetIntegerSize(binr);D = binr.ReadBytes(elems);elems = GetIntegerSize(binr);P = binr.ReadBytes(elems);elems = GetIntegerSize(binr);Q = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DP = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DQ = binr.ReadBytes(elems);elems = GetIntegerSize(binr);IQ = binr.ReadBytes(elems);// ------- create RSACryptoServiceProvider instance and initialize with public key -----CspParameters CspParameters = new CspParameters();CspParameters.Flags = CspProviderFlags.UseMachineKeyStore;int bitLen = 1024;if ("RSA2".Equals(signType)){bitLen = 2048;}RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(bitLen, CspParameters);RSAParameters RSAparams = new RSAParameters();RSAparams.Modulus = MODULUS;RSAparams.Exponent = E;RSAparams.D = D;RSAparams.P = P;RSAparams.Q = Q;RSAparams.DP = DP;RSAparams.DQ = DQ;RSAparams.InverseQ = IQ;RSA.ImportParameters(RSAparams);return RSA;}catch (Exception ex){return null;}finally{binr.Close();}}private static int GetIntegerSize(BinaryReader binr){byte bt = 0;byte lowbyte = 0x00;byte highbyte = 0x00;int count = 0;bt = binr.ReadByte();if (bt != 0x02)        //expect integerreturn 0;bt = binr.ReadByte();if (bt == 0x81)count = binr.ReadByte();   // data size in next byteelseif (bt == 0x82){highbyte = binr.ReadByte(); // data size in next 2 byteslowbyte = binr.ReadByte();byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };count = BitConverter.ToInt32(modint, 0);}else{count = bt;     // we already have the data size}while (binr.ReadByte() == 0x00){   //remove high order zeros in datacount -= 1;}binr.BaseStream.Seek(-1, SeekOrigin.Current);     //last ReadByte wasn't a removed zero, so back up a bytereturn count;}}
}

c# 支付宝生活号 获取用户信息,不使用dome相关推荐

  1. 支付宝生活号获取用户授权

    为了下次不用再去看一遍官方文档,简单的做一下笔记.想了解更多的细节,请移步支付宝官方文档 1.用户授权,拼接的url,如下: 获取用户信息的授权scope=auth_user: https://ope ...

  2. 支付宝 网页授权 获取用户信息

    ****** 支付宝 网页授权 获取用户信息(昵称,头像等)****** 最近有个项目 需要获取到支付宝的头像和昵称作为互动数据,作为php新人,对于看文档来说 很是痛苦,网上也没有很多关于支付宝网页 ...

  3. 支付宝小程序获取用户信息及手机号

    支付宝小程序获取用户信息及手机号 众所周知,微信小程序是可以通过微信本身授权后再登录,平台可以拿到微信用的的账号相关信息,然后保存到数据库中,那么同理在支付宝小程序开发过程中,登录功能的设计也可以如此 ...

  4. Thinkphp5下微信公众号获取用户信息

    前言 一直在用整理下tp5 开发微信公众号获取用户信息的简单笔记 废话不多说 直接贴代码如下: 正文 准备工作 在微信公众平台的开发者工具中申请公众平台测试账号如下图 在网页账号中 修改网页授权获取基 ...

  5. 支付宝生活号获取uid踩坑实践

    本文是向大家介绍支付宝生活号H5应用开发过程中获取用户信息的常见问题以及解决方案. 一.常见误区 1.生活号扩展区配置的活动地址跟生活号设置的授权回调域名有关系吗? 答案:没有,扩展器配置的地址可以是 ...

  6. H5网页使用支付宝授权登录获取用户信息详解

    用户信息授权 用户信息授权主要是为了获取支付宝用户ID(USER_ID).授权令牌(access_token),便于开发者处理自身业务逻辑的时候使用,例如:获取支付宝用户信息.发会员卡.快捷登录等.授 ...

  7. 通过微信公众号获取用户信息(java版)

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置 ...

  8. 微信关注公众号获取用户信息

    原本以为,获取用户信息,只能通过微信授权,后来才知道在关注公众号的时候,也可以获取到用户信息,而且这两种获取用户信息的方式是不同的,也没有什么交集 关注公众号,是通过接收事件推送,事件推送:关注成功, ...

  9. 支付宝 APP登录 获取用户信息 PHP

    支付宝APP登录服务端流程如下: 1.换取授权访问令牌 2.查询用户信息 APP调用sdk组装授权登录请求(系统交互流程),成功后,支付宝会返回 auth_code,利用此 auth_code 请求 ...

最新文章

  1. 不可思议!英伟达新技术训练NeRF模型最快只需5秒,代码已开源
  2. 10、软件质量工程师指南 - 软件项目角色指南系列文章
  3. NYOJ2—括号配对问题
  4. 《Adobe Photoshop大师班:经典作品与完美技巧赏析》即将上市
  5. Java性能优化权威指南-读书笔记(一)-操作系统性能监控工具
  6. 中文计算机语言编程优势,十种编程语言特点比较
  7. 优秀课程案例:使用Scratch制作坦克大战经典版!
  8. (Python数字图像处理)自适应中值滤波算法
  9. Django Ajax文件下载
  10. wpa_supplicant使用方法(WiFi工具)
  11. H.265中熵编码器的总结
  12. mysql免安装版本
  13. mysql查询不到的数据补0
  14. win10 开机黑屏时间长 联想y470解决方案
  15. tushare获取沪深300指数历史_tushare正确爬取 指数数据
  16. JZOJ7月28日提高组反思
  17. 顾问风采 | LF AI Data 基金会完成换届,堵俊平担任董事会主席、星爵担任会员总代表...
  18. 中式风格室内装修 如何打造中式风格家居
  19. el-checkbox的坑(点击全选状态改变了但是不生效)
  20. [前端]WdatePicker日历控件使用方法

热门文章

  1. 安卓锁屏音乐控件开发
  2. R语言glmnet包lasso回归中分类变量的处理
  3. unity vr自然灾害安全教育方案——vr地震安全(户外/家庭/校园)
  4. 和互联网大厂的爱恨情仇
  5. js数组和字符串常用方法总结
  6. springsecurity教程
  7. 你准备好结婚了吗(好文,强烈推荐)
  8. 反思过去,以期少走弯路
  9. soundEffectsEnabled
  10. oracle symonym_Oracle SYNONYM