这里,是通过云闪付接口,先获取云闪付的token,将这个token存进本地服务redis里面,作为参数,方便后面继续请求云闪付的其他接口。

mpay_url=https://open.95516.com/open/access/1.0
@Service("mPayTokenService")
public class MPayTokenService {@Autowiredprivate ScteCacheService scteCacheService;private static String successCode = "00";private static String BACK_TOKEN_URL = PropertiesConstants.MPAY_URL+"/backendToken";private static String FRONT_TOKEN_URL = PropertiesConstants.MPAY_URL+"/frontToken";public static String BACK_KEY = Constants.BACK_KEY_PRE + PropertiesConstants.MPAY_APPID;//backendTokekeypublic static String FRONT_KEY = Constants.FRONT_KEY_PRE + PropertiesConstants.MPAY_APPID;//fronttokenkey/*在开发中,有时候我们会想在项目启动时就执行某些操作,如将某些存在数据库里的数据刷到内存里以便在项目里快速使用这些数据、跑一些批处理项目启动时,利用spring容器初始化bean来实现。共3种方法: (1)通过@PostConstruct方法实现初始化bean进行操作(2)通过在bean相关的xml配置文件中配置init-method方法(3)通过bean实现InitializingBean接口*/@PostConstructpublic void init() {new Thread(new Runnable() {@Overridepublic void run() {//启动项目时redis是没有值token的,要手动调动一次job,获取一次backendToken,用setnx方式存入redis(保证只存储一次)String token = scteCacheService.getCacheStr(BACK_KEY);String fronttoken = scteCacheService.getCacheStr(FRONT_KEY);LogWriter.info("MPayTokenService.init 获取backendToken :" + token);if (StringUtil.isEmpty(token)) {LogWriter.info("初次启动项目,redis中backendToken是空,所以向云闪付app开放平台请求获取backendToken并存入redis缓存中");getBackendToken();}if (StringUtil.isEmpty(fronttoken)) {LogWriter.info("初次启动项目,redis中frontToken是空,所以向云闪付app开放平台请求获取frontToken并存入redis缓存中");getFrontToken();}}}).start();}/*** 获取应用访问令牌backendToken,是基础访问令牌,** @param* @author handong* @date 2021-3-4 10:12**/public void getBackendToken() {this.getToken(BACK_TOKEN_URL, BACK_KEY);}/*** 获取前端fronttoken*/public void getFrontToken() {this.getToken(FRONT_TOKEN_URL, FRONT_KEY);}/*** frontToken\backendtoken共用方法* @param reqUrl* @param tokenKey*/private void getToken(String reqUrl, String tokenKey){//准备参数,传递到云闪付接口,获取backendToken,其中signature是前面三个参数,secret的4个签名因子,用SHA256算法//是16位的随机字符串String nonceStr = getUUID16bit().trim();String timestamp = String.valueOf(System.currentTimeMillis()/1000);StringBuffer signSb = new StringBuffer();signSb.append("appId=").append(PropertiesConstants.MPAY_APPID).append("&").append("nonceStr=").append(nonceStr).append("&").append("secret=").append(PropertiesConstants.MPAY_KEY).append("&").append("timestamp=").append(timestamp);LogWriter.info("加密前拼接字符串为:" + signSb.toString());//请求方式POST,报文格式:json报文(contentType=application/json)JSONObject jsonObjectParams = new JSONObject();jsonObjectParams.put("appId", PropertiesConstants.MPAY_APPID);jsonObjectParams.put("nonceStr", nonceStr);jsonObjectParams.put("timestamp", timestamp);jsonObjectParams.put("signature", SHAUtil.sha256(signSb.toString().getBytes()));String jsonParams = jsonObjectParams.toString();LogWriter.info("req is :" + jsonParams);//发送请求,获取云闪付的backendToken,参数为准备好的测试数据String backendToken = getTokenByReqY(reqUrl, jsonParams);//增加二次获取,total request for 3 timesint count = 0;while (StringUtil.isEmpty(backendToken) && count < 2) {count++;try {Thread.sleep(500);//延迟0.5s再查} catch (InterruptedException e) {e.printStackTrace();}backendToken = this.getTokenByReqY(reqUrl, jsonParams);}//still no backendToken,if (StringUtil.isEmpty(backendToken)) {LogWriter.info("连续三次获取backendToken出现异常--------请检查redis中是否有backendToken,检查对接,云闪付平台接口--------");return;}//成功得到的backendToken存入redissaveBackendToken(tokenKey, backendToken);}/*** redis存值setValue** @param key* @param value* @return void* @author handong* @date 2021-3-3 17:55**/@SuppressWarnings("unchecked")public void saveBackendToken(String key, String value) {scteCacheService.setCacheHaveTimeStr(key, value, 24, TimeUnit.HOURS);}/*** 以后每隔30min定时执行一次该job任务,获取并存入缓存中setValue,刷新token值** @param* @author handong* @date 2021-3-4 10:12**/public void refreshBackendToken() {getBackendToken();}/*** 请求yunshanfu服务器获取BackendToken** @param reqUrl* @param json* @return java.lang.String* @author handong* @date 2021-3-4 16:42**/private String getTokenByReqY(String reqUrl, String reqJson) {try {FuiouHttpPoster httpPost = new FuiouHttpPoster(reqUrl, "UTF-8");String result = httpPost.newPost(reqJson);LogWriter.info("redirectOpenidThirdScte back-----BackendToken--result is :" + result);JSONObject obj = JSON.parseObject(result);String resp = obj.getString("resp");if (successCode.equals(resp)) {return obj.getString("params");} else {return null;}} catch (Exception e) {e.printStackTrace();return null;}}/*** get a random string ,16 bits length** @param* @return java.lang.String* @author handong* @date 2021-3-4 15:45**/public static String getUUID16bit() {String uuid = UUID.randomUUID().toString();char[] cs = new char[32];char c = 0;for (int i = uuid.length() / 2, j = 1; i-- > 0; ) {if ((c = uuid.charAt(i)) != '-') {cs[j++] = c;}}return String.valueOf(cs);}public static void main(String[] args) {String s;for(int i=0;i>10;i++) {s = getUUID16bit().trim();System.out.println(i+"--"+s.length());}}
}

获取云闪付token值,在spring中使用一个单线程的例子相关推荐

  1. uniapp开发云闪付小程序。

    第一步:接入upsdk.js. 按照官方文档说明: 接入方使用云闪付 APP 小程序前端 API 前,需在调用页面(必须为 https )引入插件 upsdk.js 文件.我们需要在项目根目录中,新建 ...

  2. php curl查看获取请求头-swoft1请求头变小写银联云闪付header请求对方接收不到

    php curl查看获取请求头-银联云闪付header请求对方接收不到 php curl查看获取请求头-银联云闪付header请求对方接收不到 php curl查看获取请求头-银联云闪付header请 ...

  3. 银联云闪付二维码支付对接流程和测试

    因为公司已经支持了支付宝支付和微信支付,所以需要加上一个银联的云闪付,主要是二维码支付. 银联商务的官方文档其实已经很清楚了,但是因为之前对接支付宝和微信,有一个保存商户信息的表,表结构已经确定了,再 ...

  4. 从0到1学习云闪付开发,云闪付小程序崛起之玩转云闪付小程序

    一.技术探索 云闪付小程序开发,也是最近两年才发展起来,对于绝大多数人来说是一个新的起点.新的领域,然鹅,对于一个开发老兵来说一切都如履平地. 废话不多说,直入主题,让我带领大家一起探索云闪付开发技术 ...

  5. 对接微信、云闪付H5页面开发走过的坑

    1 准备工作 微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名,获取到项目对应的appId 2 使用微信提供的API函数 0 在需 ...

  6. 用云闪付乘坐公交地铁,能否享受到优惠,取决于这一点

    有的朋友问我,为什么我有的时候用云闪付乘坐地铁,能享受很大的优惠,比如5元省2元: 甚至可以只花一分钱就能乘坐公交,可以说基本是免费的了: 而为什么有的时候又是原价,一分钱优惠都没有呢? 奥秘在这里. ...

  7. 微信支付携手云闪付APP上线支付立减新优惠

    3月24日消息,随着数字经济.数字金融的高速发展,支付领域的互联互通不断深化.近日,微信支付联合银联云闪付APP更新上线了"助力抗疫·微信小程序多重礼"活动,新增"满10 ...

  8. “2019年新出的境外云闪付是什么?

    境外云闪付消费提额系统携手中国银联,只需一个APP解决境外支付难题,与银联云闪付合作,100%落地真实商户,保证每一笔账单都真实有效,无需刷卡机,真正的避免卡片被复制和盗刷的可能,操作简单,只需在AP ...

  9. 智慧商圈,对接微信、支付宝、云闪付实现自动积分

    线下交易 商城下的门店使用本公司内部的pos机以及会员管理系统,通过pos收银时,根据管理系统配置的积分规则,可以自行给会员积分.但是当商城内部的部分门店不是使用内部的pos机进行收银时,则无法给给该 ...

最新文章

  1. 正则表达式grep、egrep--already
  2. 后Hadoop时代的大数据技术思考:数据即服务
  3. 多种方法解决Exchange 2010 EMC批量启用邮箱之后出..
  4. pyqt开发的程序模板_小程序定制开发和模板开发要多少钱?有什么区别?
  5. 面向对象chapter1
  6. 美团外卖Android平台化的复用实践
  7. python开发信息系统权限设置_利用Python实现权限设置的详细教程
  8. C#LeetCode刷题之#257-二叉树的所有路径(Binary Tree Paths)
  9. 苹果safari关掉java_如何在Safari,Chrome,Firefox和系统范围内禁用Java | MOS86
  10. POSIX 信号量和互斥锁
  11. #leetcode刷题之路39-组合总和
  12. 国内流行的两大开源.net微信公众平台SDK对比分析
  13. Pro Git CN Plus
  14. MyBatis笔记(一) 最简单的select
  15. Android gdb 调试
  16. python爬虫做灰产_python爬虫
  17. 计算机算法设计与分析(1)--算法概述
  18. java简单选择排序以及时间复杂度
  19. APTHunter——Windows安全日志排查好帮手
  20. 20210610 线程数不断飙升问题定位

热门文章

  1. LINK : fatal error LNK1104: 无法打开文件“mfc90ud.lib”
  2. 轻型社交圈系统交友及时聊天集成商城/语音聊天派对/交友广场,仿小红书
  3. Apple Xcode 14.3 (14E222b) 正式版发布下载
  4. oracle数据加密方式,Oracle数据加密方法分析
  5. Java中的实体类为什么要 implements Serializable?
  6. 防火墙Mangle-简介从零开始学RouterOS系列07
  7. JavaScript经典教程
  8. [C语言]C语言第二周总结
  9. Sentinel-流量防卫兵
  10. python 麦克风人声检测_如何选择最适合自己的人声麦克风?