重点在于aes加密规则,还有加密data和sign使用的secret和aesKey不要取错了。
我也是试了好多种加密方式才得出结果,现在分享给大家。

说明一下,我用的PHP版本是PHP7.3.4 ,Laravel5.7

先上平安银行提供的 java demo:

public class demo {/*** 链接拼接* @param initDTO* @return*/public static String getUrl(InitailFormDTO initDTO){//sign加密KEYString secret="Ued234fKsd3*45fLNs3-45dfk57s";//AES加密KEYString aesKey="BWTAws7fQgOJlgLFK-xIhA..";String url="";//data值 获取String data=paramData(initDTO,aesKey);if (isNullOrBlank(data)) {return "ERROR.";}else{System.out.println("data最终结果:"+data);}//sign值 获取String sign=paramSign(initDTO,secret);if (isNullOrBlank(sign)) {return "ERROR.";}else{System.out.println("验签最终结果:"+sign);}//生成最终URl(注意测试环境和生产环境 请求不同)url= "https://pacesapplystg.pingan.com/ca/applyIndex?"+"data=" + data + "&sign=" + sign;return url;}/*** AES  获取data值* (key值顺序不一致,可能会导致加密结果不一致。可以收)* @param initDTO* @param aesKey* @return*/public static String paramData(InitailFormDTO initDTO,String aesKey){//生成jason格式字段    直接使用gson,可能会更好String jsonParam = JSONObject.toJSONString(getJasonMap(initDTO));//字段转Json System.out.println("json格式结果:"+jsonParam);String result = encrypt(jsonParam, aesKey);//AES加密System.out.println("AES加密后结果:"+result);if (!isNullOrBlank(result)) {  //在最前面拼上9位的SCC和20位的mt参数值(mt参数如果不足20位用0补足),形成最终的密文数据。    if (isNullOrBlank(initDTO.getMt())) {return initDTO.getScc() + "00000000000000000000" + result;} else {return initDTO.getScc() + StringUtils.leftPad(initDTO.getMt(), 20, '0') + result;}}else{return null;}}/*** HmacSHA256验签  获取sign值* @param initDTO* @param aesKey* @return*/public static String paramSign(InitailFormDTO initDTO,String secret){String generateSign = null;try {Field[] fields = InitailFormDTO.class.getDeclaredFields();List<String> list = new ArrayList<String>();if (fields != null) {for (Field a : fields) {String name = a.getName();Method m = InitailFormDTO.class.getMethod("get" + name.substring(0, 1).toUpperCase() + name.substring(1));if (!isNullOrBlank((String) m.invoke(initDTO))) {list.add(name);}}if (list.size() > 0) {Collections.sort(list);//将所有参数按key的ASCII码从小到大排序StringBuffer bf = new StringBuffer();for (String key : list) {//使用&符号拼接String value = (String) InitailFormDTO.class.getMethod("get" + key.substring(0, 1).toUpperCase() + key.substring(1)).invoke(initDTO);bf.append("&");bf.append(key);bf.append("=");bf.append(value);}//将最终的字符串转换成全大写,再使用HmacSHA256进行签名。System.out.println("排序后拼接转大写:"+bf.substring(1).toString().toUpperCase());  generateSign = sign(bf.substring(1).toString().toUpperCase(),secret);}}return generateSign;} catch (Exception e) {return null;}}/**                                        * AES加密 * 参数使用json格式,* AES加密后再对加密后的字符串进行UrlBase64编码,* @param data                                        *            需要加密的字符串                                       * @param aesKey                                        *            AES key                                        * @return                                      *//*** json格式结果:{"partnerSeqId":"m180320106300000201804191255555271111","scc":"920000999","templateNo":"s180419Oot","mt":"123456789","ccp":"1a2a3a9","versionNo":"R10310","onlineSQFlag":"N","cardCatenaNo":"01a02a04","channel":"WXHZF"}* AES加密后结果:Ke19Ek_N6FrJf6KCOjodGViA2Dapm1GRjcog4mupkeskTmfa1VHvY9F5TBLyBBqxtykc9AGBSbOkkEG-GdB9bcBd6iWj2GmmMX5WxL1XtcRxVRW081AeLgKz_jVmVKfk-Wkl2g-Fzky57ChiGTZ8begt0BKM4a4623HRuXuVCVHFpeKjTCMVS7iLaem4uRJVslBx_Yd5gGQLLHk-qH2C6CPBd-OgOv6Kp4e05L4tioAj5X-bxSsMdQsgoctjBCu28jI8_DUEFBrANyuFBEUqKfbAVVQwFefZBMmFEc11FBo.**/public static String encrypt(String data, String aesKey) {                                     try {                                       if (isNullOrBlank(data) || isNullOrBlank(aesKey)) {                                 System.out.println("AESUtil.encrypt data or aesKey is null.");                                return null;                                }byte[] aesByte = UrlBase64.decode(aesKey);                                    SecretKeySpec skeySpec = new SecretKeySpec(aesByte, "AES");                                  Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");                                  cipher.init(Cipher.ENCRYPT_MODE, skeySpec);                                 byte[] encryptedByte = cipher.doFinal(data.getBytes("utf-8"));                                   return new String(UrlBase64.encode(encryptedByte));                                 } catch (Exception e) {                                     System.out.println("AESUtil.encrypt exception."+e);                                  return null;                                    }                                       }   public static String desEncrypt(String data, String key, String ivString){byte[] iv = null;try {iv = ivString.getBytes();byte[] encryp = Base64.getDecoder().decode(data);Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(iv);cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] original = cipher.doFinal(encryp);return new String(original);} catch (Exception e) {e.printStackTrace();}return null;}/**                                              * HmacSHA256加密  * 请确保key值顺序排列                                           * @param value                                             *            需要加密的字符串                                               * @param secret                                                *            HmacSHA256 key                                             * @return                                              */                                              public static String sign(String value,String secret) {                                             try {                                           Mac sha256_HMAC = Mac.getInstance("HmacSHA256");                                     SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");sha256_HMAC.init(secret_key);                                      String hash =new String(UrlBase64.encode(sha256_HMAC.doFinal(value.getBytes("utf-8"))));                                     return hash;                                        } catch (Exception e) {                                         System.out.println("Failed to generate the sign."+ e);                                       return null;                                        }                                           }   public static boolean isNullOrBlank(String str) {if (str == null || str.equals("") || str.equals("null")) {return true;} else {return false;}}/*** 判断每个字段是否为空* 返回去除value的key值* @param obj* @return*/private static Map<String,String> getJasonMap(Object obj){Field[] field = obj.getClass().getDeclaredFields();Map<String,String> returnMap=new HashMap<String,String>();try {for (int j = 0; j < field.length; j++) {String name = field[j].getName();// 过滤serialVersionUID字段if ("serialVersionUID".equals(name)) {continue;}String name1 = name.substring(0, 1).toUpperCase() + name.substring(1);Method m = obj.getClass().getMethod("get" + name1);String value = (String) m.invoke(obj);if (!isNullOrBlank(value)) {returnMap.put(name, value);}}} catch (Exception e) {System.out.println(e);}return returnMap; }   public static void main(String[] args) {String url="";InitailFormDTO initDTO=new InitailFormDTO();StringBuilder random = new StringBuilder();for (int i = 0; i < 40; i++) {int nextInt = new Random().nextInt(10);System.out.println(nextInt);random.append(nextInt);}SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");String data = simpleDateFormat.format(new Date());/***************************参数赋值,请和业务确定*********************************************//*11位商户号+ 时间(yyyyMMddHHmmssSSS) + 4位随机数据数字。* 商户号业务分配* 时间可以自己用工具类生成* 随机数可自己定义**流水号只能点一次。*流水号只能用一次*流水号只能开一次。*/initDTO.setPartnerSeqId("m180320106300000"+data+ random.toString());initDTO.setScc("920000999");// 业务分配initDTO.setTemplateNo("s180419Oot"); // 业务分配initDTO.setMt("123456789"); // 咨询业务initDTO.setCcp("1a2a3a9"); // 咨询业务initDTO.setVersionNo("R10310"); // 业务分配initDTO.setOnlineSQFlag("N"); // 定值 initDTO.setCardCatenaNo("01a02a04"); // 咨询业务initDTO.setChannel("WXHZF"); // 定值/***************************中文记得转码UTF-8*************************************************/System.out.println("需要加密的入参:"+initDTO);url=getUrl(initDTO);System.out.println( "最终生成测试环境url:" + url);/*** 结果:* 需要加密的入参:InitailFormDTO [versionNo=R10310, scc=920000999, onlineSQFlag=N, channel=WXHZF, cardCatenaNo=01a02a04, ccp=1a2a3a9, cf=null, cc=null, salesName=null, salesCode=null, salesmanPhoneNO=null, bt1=null, bt2=null, bt3=null, bt4=null, bt5=null, bt6=null, bt7=null, bt8=null, bt9=null, bt10=null, mt=123456789, recommendChineseName=null, recommendPhone=null, isDisplayRecommend=null, isDisplaySales=null, onePlusOneWB=null, onePlusOneYL=null, url=null, templateNo=s180419Oot, partnerSeqId=m180320106300000201804191255555271111, idCardStatus=null, partnerInfoIndex=null, salesmanType=null, hasZiGeSaleMan=null]* json格式结果:{"partnerSeqId":"m180320106300000201804191255555271111","scc":"920000999","templateNo":"s180419Oot","mt":"123456789","ccp":"1a2a3a9","versionNo":"R10310","onlineSQFlag":"N","cardCatenaNo":"01a02a04","channel":"WXHZF"}* AES加密后结果:Ke19Ek_N6FrJf6KCOjodGViA2Dapm1GRjcog4mupkeskTmfa1VHvY9F5TBLyBBqxtykc9AGBSbOkkEG-GdB9bcBd6iWj2GmmMX5WxL1XtcRxVRW081AeLgKz_jVmVKfk-Wkl2g-Fzky57ChiGTZ8begt0BKM4a4623HRuXuVCVHFpeKjTCMVS7iLaem4uRJVslBx_Yd5gGQLLHk-qH2C6CPBd-OgOv6Kp4e05L4tioAj5X-bxSsMdQsgoctjBCu28jI8_DUEFBrANyuFBEUqKfbAVVQwFefZBMmFEc11FBo.* data最终结果:92000099900000000000123456789Ke19Ek_N6FrJf6KCOjodGViA2Dapm1GRjcog4mupkeskTmfa1VHvY9F5TBLyBBqxtykc9AGBSbOkkEG-GdB9bcBd6iWj2GmmMX5WxL1XtcRxVRW081AeLgKz_jVmVKfk-Wkl2g-Fzky57ChiGTZ8begt0BKM4a4623HRuXuVCVHFpeKjTCMVS7iLaem4uRJVslBx_Yd5gGQLLHk-qH2C6CPBd-OgOv6Kp4e05L4tioAj5X-bxSsMdQsgoctjBCu28jI8_DUEFBrANyuFBEUqKfbAVVQwFefZBMmFEc11FBo.* 排序后拼接转大写:CARDCATENANO=01A02A04&CCP=1A2A3A9&CHANNEL=WXHZF&MT=123456789&ONLINESQFLAG=N&PARTNERSEQID=M180320106300000201804191255555271111&SCC=920000999&TEMPLATENO=S180419OOT&VERSIONNO=R10310* 验签最终结果:iMMUARHZgiCRSzKOfp0dJ0-pbxCbH7eoPmB3eKj2nGs.* 最终生成测试环境url:https://pacesapplystg.pingan.com/ca/applyIndex?data=92000099900000000000123456789Ke19Ek_N6FrJf6KCOjodGViA2Dapm1GRjcog4mupkeskTmfa1VHvY9F5TBLyBBqxtykc9AGBSbOkkEG-GdB9bcBd6iWj2GmmMX5WxL1XtcRxVRW081AeLgKz_jVmVKfk-Wkl2g-Fzky57ChiGTZ8begt0BKM4a4623HRuXuVCVHFpeKjTCMVS7iLaem4uRJVslBx_Yd5gGQLLHk-qH2C6CPBd-OgOv6Kp4e05L4tioAj5X-bxSsMdQsgoctjBCu28jI8_DUEFBrANyuFBEUqKfbAVVQwFefZBMmFEc11FBo.&sign=iMMUARHZgiCRSzKOfp0dJ0-pbxCbH7eoPmB3eKj2nGs.*/}
}

demo最后试加密过程的打印结果,按照打印结果对照执行结果是否一致

<?phpclass Service
{protected $domain = 'https://pacesapplystg.pingan.com/';public function __construct () {parent::__construct();}//入口方法public function getBankUrl($params = [],$serial_number = ''){$requestData = '{"partnerSeqId":"m180320106300000201804191255555271111","scc":"920000999","templateNo":"s180419Oot","mt":"123456789","ccp":"1a2a3a9","versionNo":"R10310","onlineSQFlag":"N","cardCatenaNo":"01a02a04","channel":"WXHZF"}';$requestData = json_decode($requestData, true);$SECRET = 'Ued234fKsd3*45fLNs3-45dfk57s';$AESKEY = 'BWTAws7fQgOJlgLFK-xIhA..';$data = $this->paramData($requestData, $AESKEY);dump("data最终结果:".$data);$sign = $this->paramSign($requestData, $SECRET);dump("验签最终结果:".$sign);  return $this->domain."ca/applyIndex?data=" . $data  ."&sign=" . $sign;}public function getUrlParams($param){ksort($param);$str = '';//循环拼接参数foreach ($param as $key => $value) {$str .= $key . "=" . urlencode($value) . "&";}$str = substr($str, 0, strlen($str) - 1);return $str;}public function paramData($param = [], $aesKey){$jsonParam = json_encode($param);dump("json格式结果:".$jsonParam);$result = $this->ssl_encrypt($jsonParam, $aesKey);dump('AES加密后结果:'.$result);if(!$result) {return false;}$data_per = $param['scc'];if(isset($param['mt'])){$num_len = strlen($param['mt']);for($i = 0; $i <20-$num_len; $i++){$data_per = $data_per . '0';}$data_per .= $param['mt'];} else{for($i = 0; $i <20; $i++){$data_per = $data_per . '0';}}$result = $data_per.$result;return $result;}/*** 获取sign(HmacSHA256验签)* @param array $params* @param string $secret* @return string*/public function paramSign($params = [], $secret = ''){ksort($params);$str = '';foreach ($params as $key => $value) {$str .= $key . "=" . urlencode($value) . "&";}$str = substr($str, 0, strlen($str) - 1);//字符串转大写$str = strtoupper($str);//HMAC-SHA256加密$sign = hash_hmac('sha256', $str, $secret, true);//参数编码$sign = $this->base64UrlEncode($sign);return $sign;}/*** PHP7 AES 加密* @param $str* @param $aesKey* @return mixed*/public function ssl_encrypt($str, $aesKey){$data = openssl_encrypt($str, 'aes-128-ecb', $this->base64UrlDecode($aesKey), OPENSSL_RAW_DATA);return $this->base64UrlEncode($data);}/*** 获取sign(HmacSHA256验签)* @param $data* @param $secret* @return string|string[]*/public function sign($data, $secret){ksort($data);$str = '';foreach ($data as $key => $value) {//拼接参数$str .= $key . "=" . urlencode($value) . "&";}//去除最后一个字符$str = substr($str, 0, strlen($str) - 1);//字符串转大写$str = strtoupper($str);//HMAC-SHA256加密$sign = hash_hmac('sha256', $str, $secret, true);$sign = $this->base64UrlEncode($sign);return $sign;}public function base64UrlEncode($str){$data = base64_encode($str);$data = str_replace(array('+', '/', '='), array('-', '_', '.'), $data);return $data;}public function base64UrlDecode($str){$data = str_replace( array('-', '_', '.'), array('+', '/', '='),$str);return base64_decode($data);}
}

控制打印结果:

平安信用卡获取落地页接口demo(PHP版)相关推荐

  1. php获取落地页的信息,信息流广告落地页如何设计?落地页落地页设计注意事项...

    信息流广告落地页如何设计?落地页落地页设计注意事项 信息流广告优化师都有可能遇到这个问题:转化差-被老板骂-工资低 所以,今天咱就来聊一聊"如何正确地提升转化效果". 什么是着陆页 ...

  2. php银联支付接口 demo,php版银联支付接口开发简单实例详解

    这篇文章主要介绍了php版银联支付接口开发的方法,结合实例形式分析了php银联支付接口开发的具体流程与相关操作技巧,需要的朋友可以参考下 支付接口现在有第三方的支付接口也有银行的支付接口.这里就来介绍 ...

  3. 百度搜索接口api_百度站长平台上线落地页视频转存功能,确保专业问答视频资源的质量和稳定性...

    近日百度搜索资源平台上线了落地页视频转存功能,旨在确保专业问答支持合作方在提交视频类型问答资源时的视频资源质量和稳定性. 百度搜索资源平台对此功能的使用说明如下两点: 专业问答支持合作方提交视频类型问 ...

  4. 【2020-07】落地页获取百度搜索关键字最新方法

    js获取访客百度搜索词最新方法 此方法不仅可以在搜索落地页获取百度的访客搜词关键词,在进入页面后的任意浏览页都能快速获取到本次访客来访的搜索引擎以及搜索关键词. 如果需要实时监控访客的搜索关键词数据请 ...

  5. 递归获取翻页数据(TAPD接口实战)

    前言:很多接口是通过翻页获取数据,如何通过递归的方法获取翻页数据呢 以下用递归的方法获取TAPD缺陷数据: def get_bus_from_project_v2(workspace_id, limi ...

  6. 零基础微信落地页小程序实战项目

    前言 微信小程序简单易上手,只要有一些编程基础,即可快速开发基本的项目. 本项目是常见的,商品广告落地页小程序.提供商品浏览,商品列表按钮,购买,微信授权,手机号绑定,验证码校验,用户协议,消息通知, ...

  7. 30个网站产品落地页免费模板(附下载)

    找到了用户需求痛点,花了几个星期或者几个月开发了产品,这时候最需要的是什么?是一个产品展示的落地页. 不管是售卖在线服务.数字产品.电子书.还是在线课程,都需要一个产品的展示页来向用户展示你提供的服务 ...

  8. 京东商品获取优惠券API接口-京东优惠券如何获取-京东联盟API接口

    京东单品优惠券获取教程 一.应用场景 二.环境 三.详细操作 只有一个单品应该怎么获取优惠券接口? 一.应用场景 API接口说明: 通过商品链接或SKU,获取京东最优券,方便用户领券,提升用户体验 应 ...

  9. 如何使用WordPress制作落地页

    是否要在WordPress网站上创建自定义落地页? 落地页是一个高度优化的营销页面.它帮助企业将网站访问者转化为客户和潜在客户. 在本文中,我们将向您展示如何使用WordPress制作落地页. 下面是 ...

最新文章

  1. 织梦 ajax 返回,Dede织梦arclist标签+Ajax实现织梦首页分页-叙述织梦
  2. 人造肌肉机械臂太逼真引热议,举7kg哑铃“肌肉”清晰可见,网友:《西部世界》...
  3. 浮动div 内部元素 垂直居中
  4. 【蓝桥杯】基础练习 十六进制转八进制(Java实现)
  5. 问题 E: 小鱼的数学问题(递推)
  6. 从“小白”到“白帽子黑客”的实用指南
  7. PHP极其强大的图片处理库Grafika详细教程(4):图形绘制
  8. 问题记录 | 配置ubuntu18.04+cuda9.0+cudnn服务器tensorflow-gpu深度学习环境
  9. 狂神说 es笔记_【开源推荐】专门为程序员朋友量身打造的笔记软件—— Boostnote...
  10. 基于 snowNLP的微博评论数据情感分析
  11. windows下怎么打开psql命令
  12. 如何安装树莓派摄像头模块
  13. 在r中弄方差分析表_使用R语言进行单因素方差分析
  14. oracle exadata维保,EXADATA数据一体机巡检说明
  15. 透彻理解神经网络剪枝算法
  16. [附源码]Nodejs计算机毕业设计科技类产品众筹系统Express(程序+LW)
  17. 文献解析:生存数据和分类结局列线图的做法,史上最全
  18. gradle编译错误:Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one
  19. 朴素贝叶斯基于朴素贝叶斯的文本分类算法
  20. 领域驱动设计实现疑难解答(一):如何分包及组织工程结构

热门文章

  1. 一个封装的QQ面板控件
  2. ubuntu16.04下安装如何安装.deb安装包
  3. android 读取图片信息,Android 图片Exif 信息读取和写入
  4. 拍拍贷逾期最小化分析
  5. python如何判断一个数为小数_python判断是否是小数
  6. C++串口通信编程(异步通信)
  7. 理光310/320/325系列激光打印机加粉后不换芯片清零方法
  8. 外贸人必备工具(上)
  9. tlwr845n服务器未响应,联普TL-WR845N路由器WDS桥接如何设置
  10. linux定时执行shell脚本