weixin_44680687 2023-03-01 11:28 采纳率: 0%
浏览 32

以下Java代码如何用PHP实现?


//appSecret
private static String appSecret = "aaaa";
private static String token = "bbbb"; //token
public static void main(String[] args) throws Exception
{
Map<String, String> textParams = new HashMap<String, String>();
// 添加协议级请求参数
textParams.put("method", apiName);
textParams.put("version", "3.0");
textParams.put("appKey", appKey);
textParams.put("format", "json");
textParams.put("timestamp", new Date().getTime()+"");
textParams.put("token", token);
textParams.put("type", "sync");
String requestBody =
"{\"requestId\":\"00\"," +
"\"deviceType\":\"0\",\"invoiceTypeCode\":\"0\",\"machineNo\":\"00\","
+
"\"sellerTaxNo\":\"0\"," +
"\"apiName\":\"baiwang.tax.monitor.query\"," +
"\"taxNo\":\"0\",\"methodCode\":\"02\"}";
String signString = signTopRequest(textParams, appSecret, requestBody);//签名参System.out.println(signString);
}
/**

* 给 TOP 请求签名。
*
* @param params 所有字符型的 TOP 请求参数
* @param secret 签名密钥
* @return 签名
* @throws Exception
*/
public static String signTopRequest(Map<String, String> params, String secret, String
body) throws Exception
{
// 第一步:检查参数是否已经排序
ArrayList<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
// 第二步:把所有参数名和参数值串在一起
StringBuilder query = new StringBuilder();
query.append(secret);
for (String key : keys)
{
String value = params.get(key);
if (!isNull(key) && !isNull(value))
{
query.append(key).append(value);
}
}
body.replaceAll("\n","");
body.replaceAll("\t","");
body.replaceAll("\r","");
query.append(body);
query.append(secret);
// 第三步:使用 MD5 加密
 
byte[] bytes;
MessageDigest md5 = null;
try
{
md5 = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException ignored)
{
throw new Exception(ignored);

}
bytes = md5.digest(query.toString().getBytes("UTF-8"));
// 第四步:把二进制转化为大写的十六进制
StringBuilder sign = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
public static boolean isNull(String str)
{
return (str==null || "".equals(str)?true:false);
}

  • 写回答

2条回答 默认 最新

  • Web Security Loop 2023-03-01 11:45
    关注
    
    <?php
    $appSecret = "aaaa";
    $token = "bbbb";
    $textParams = array(
        'method' => $apiName,
        'version' => '3.0',
        'appKey' => $appKey,
        'format' => 'json',
        'timestamp' => time(),
        'token' => $token,
        'type' => 'sync'
    );
    $requestBody = array(
        'requestId' => '00',
        'deviceType' => '0',
        'invoiceTypeCode' => '0',
        'machineNo' => '00',
        'sellerTaxNo' => '0',
        'apiName' => 'baiwang.tax.monitor.query',
        'taxNo' => '0',
        'methodCode' => '02'
    );
    $body = json_encode($requestBody);
    $signString = signTopRequest($textParams, $appSecret, $body);
    echo $signString;
    
    function signTopRequest($params, $secret, $body) {
        ksort($params);
        $query = $secret;
        foreach ($params as $key => $value) {
            if (!isNull($key) && !isNull($value)) {
                $query .= $key . $value;
            }
        }
        $body = str_replace(array("\n", "\t", "\r"), '', $body);
        $query .= $body . $secret;
        $sign = strtoupper(md5($query));
        return $sign;
    }
    
    function isNull($str) {
        return ($str == null || $str == '');
    }
    ?>
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆