详尽分享菜鸟天地对接功能之单点接入分享

简介: 详尽分享菜鸟天地对接功能之单点接入分享

最近在跟菜鸟天地系统对接,业务中涉及到单点接入,感觉其实现思想很不错,现分享一下,供大家参考:

从CP内部系统进入菜鸟天地,也就是从菜鸟的合作伙伴(物流或快递公司内部系统)单点跳转进入菜鸟天地系统

红色的请求需要CP实现(合作方):

1、LINK接口( ):服务器端获取快速登录菜鸟的令牌(loginToken) CNUSER_GET_LOGIN_TOKEN 请求参数:员工工号 返回参数:loginToken

2、生成快速登录菜鸟的URL,并从浏览器发起302跳转 #* goto:登陆后的目标跳转地址。如菜鸟天地的地址为:http%3a%2f%2ffly.cainiao.com login_token:菜鸟返回的令牌(注意:login_token使用一次后即失效,且LINK接口返回起60秒后超时失效)

功能实现:用户在合作方系统登录后,访问菜鸟天地链接时调用菜鸟接口返回认证token,再构造地址跳转到菜鸟天地系统,token使用一次后失效

从合作方登录菜鸟天地

///

/// 登录菜鸟天地系统

///

///

public ActionResult CaiNiaoTianDi()

{

string userCode = UserInfo.Code;

try

{

JsonResult[span style="color: rgba(0, 0, 255, 1)">string

if (result.Status)

{

string token = result.ResultValue;

string url = string.Format("http://login.cainiao.com/cplogin.htm?loginToken={0}&redirectUrl=https://fly.cainiao.com", token);

return Redirect(url);

}

else

{

return Content("登录菜鸟系统出错" + result.Data);

}

}

catch (Exception ex)

{

NLogHelper.Warn(ex, "登录菜鸟系统异常");

return Content("登录菜鸟系统异常");

}

}

///

/// 获取登录菜鸟系统的token

///

///

///

public static JsonResult[span style="color: rgba(0, 0, 255, 1)">string

{

JsonResult[span style="color: rgba(0, 0, 255, 1)">stringstring

JavaScriptSerializer serializer = new JavaScriptSerializer();

serializer.RegisterConverters(new JavaScriptConverter【】 { new ExpandoJsonConverter() });

result.Status = false;

result.StatusMessage = "未知错误";

string response = string.Empty;

string logisticsInterface = string.Empty;

string dataDigest = string.Empty;

// 已在菜鸟平台配置json格式数据传输

using (WebClient webClient = new WebClient())

{

NameValueCollection postValues = Init();

dynamic user = new ExpandoObject();

user.employee_no = userCode;

// 调用删除

logisticsInterface = serializer.Serialize(user);

dataDigest = CaiNiaoApiUtilities.SignSdkRequest(logisticsInterface, secretKey);

// 根据员工工号删除用户信息

postValues.Add("employee_no", userCode);

postValues.Add("msg_type", "CNUSER_GET_LOGIN_TOKEN");

postValues.Add("data_digest", dataDigest);

postValues.Add("logistics_interface", logisticsInterface);

byte【】 responseArray = webClient.UploadValues(url, //代码效果参考:http://www.zidongmutanji.com/zsjx/536075.html

postValues);

response = Encoding.UTF8.GetString(responseArray);

// 根据返回值判断

dynamic obj = serializer.Deserialize(response);

// 逻辑判断

if (IsPropertyExist(obj, "success") && obj.success == "true")

{

result.Status = true;

result.ResultValue = obj.login_token;

result.Data = response;

result.StatusMessage = "成功返回";

}

else

{

result.Status = false;

result.Data = response;

result.StatusMessage = "调用失败";

}

}

return result;

}

///

/// 签名

///

//代码效果参考:http://www.zidongmutanji.com/bxxx/353114.html

///

///

///

public static string SignSdkRequest(string content, string secretKey)

{

byte【】 binaryData = Encoding.UTF8.GetBytes(content + secretKey);

MD5 md5 = new MD5CryptoServiceProvider();

byte【】 output = md5.ComputeHash(binaryData);

string dataDigest = Convert.ToBase64String(output);

return dataDigest;

}

///

/// 初始化

///

///

private static NameValueCollection Init()

{

NameValueCollection postValues = new NameValueCollection();

postValues.Add("logistic_provider_id", logisticProviderId);

postValues.Add("to_code", "");

return postValues;

}

java版本的签名方法

String logisticsInterface = JSONArray.toJSONString(userMap);

String dataSign = logisticsInterface + secretKey;

byte【】 binaryData=dataSign.getBytes("UTF-8");

byte【】 signatureData = DigestUtils.md5Digest(binaryData);

String dataDigest = Base64.encodeBase64String(signatureData);

如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击文章下方“推荐”按钮【精神支持】,您的“推荐”将是我最大的写作动力!

欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

相关文章
|
SQL 运维 网络协议
【运维】阿里云宝塔面板部署JavaWeb项目
【运维】阿里云宝塔面板部署JavaWeb项目
1801 0
【运维】阿里云宝塔面板部署JavaWeb项目
|
Java 分布式数据库 数据库
软件各种系统架构图
原文:软件各种系统架构图 https://blog.csdn.net/everythingss/article/details/78749247     该技术架构图是本人根据多年企业技术架构经验而制定,是企业技术的总架构图,希望对CTO们有所借鉴。
9219 0
|
人工智能 边缘计算 运维
AI 时代下,操作系统的进化与重构
随着人工智能(AI)的迅猛发展,操作系统面临着前所未有的挑战和机遇。在这个新时代,操作系统需要进行深刻的进化与重构,以适应AI技术的广泛应用和不断变化的需求。
976 5
|
缓存 NoSQL 关系型数据库
消息系统的4大使用场景
消息系统的4大使用场景
274 0
|
Java 数据库 Spring
services层和controller层
Controller层和Services层是现代Web应用程序中的两个关键层次。Controller层负责处理客户端请求和生成响应,而Services层负责实现业务逻辑和数据操作。通过将职责明确分离,可以提高代码的可维护性、可扩展性和测试性。希望本文能帮助您更好地理解这两个层次及其实现方法,并在实际开发中应用这些最佳实践。
1400 1
|
数据采集 物联网
三分钟轻松搞定固定资产盘点--首码RFID资产盘点小助手
首码 RFID 盘点小助手是一款功能强大、操作便捷的资产管理工具,能够助力企业在短短 3 分钟内轻松完成资产盘点
764 9
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
1616 1
|
前端开发 NoSQL Java
聊聊公众号联动扫码登录功能如何实现
大家好,我是V哥。本文介绍了如何通过微信公众号实现扫码登录功能,包括申请权限、生成二维码、用户授权、获取用户信息、建立会话等步骤。假设你已有一个Java后端应用,并完成了微信开发者平台的配置。文中提供了详细的代码示例,帮助你快速实现这一功能。
1377 0
|
JavaScript 前端开发 C#
从入门到放弃,我们为何从 Blazor 回到 Vue
【10月更文挑战第29天】在前端开发中,许多开发者从尝试新技术 Blazor 最终回到熟悉的 Vue。主要原因包括:1) Blazor 学习曲线陡峭,Vue 上手容易;2) Vue 开发工具成熟,开发效率高;3) Vue 性能优异,优化简单;4) Vue 社区庞大,生态丰富;5) 项目需求和团队协作更适配 Vue。选择技术栈需综合考虑多方面因素。
1754 0

热门文章

最新文章