http通过数字签名加密方式进行post请求

4 篇文章 0 订阅
2 篇文章 0 订阅

我们有时候需要跟别的系统进行数据的对接。例如,别人提供数据接口,我们需要通过数字加密方式进行post的请求获取数据,这篇文章针对这个展开。其中,数据的方式是json格式,希望对你们有所帮助。直接上代码:
日志打印:

private static Logger log = Logger.getLogger(ReformTools.class);

post请求:

public static String getDataFromReformByPost(String json) throws IOException, CloneNotSupportedException {

        String url = "";
     
        //进行消息摘要
        url = MessageDigest(url);

        CloseableHttpClient client = HttpClients.createDefault();

        // 创建HttpPost对象
        HttpPost httpPost = new HttpPost(url);

        // 设置HTTP POST请求参数用json装填参数
        StringEntity stringEntity = new StringEntity(json, "utf-8");
        // 设置请求编码
        stringEntity.setContentEncoding("utf-8");
        // 设置请求类型
        stringEntity.setContentType("application/json");

        CloseableHttpResponse httpResponse = null;
        try {

            // 设置httpPost请求参数,设置参数到请求对象中
            httpPost.setEntity(stringEntity);

            httpResponse = client.execute(httpPost);
            String result = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
            if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // 使用getEntity方法活得返回结果
                return result;
                
            } else {
                log.error("sendRequest error: " + url + ",response:" + result);
                return result;
            }
        } catch (Exception e) {
            log.error("sendRequest error: " + url);
            log.error(e.getMessage(), e);
        } finally {
            if (client != null) {
                client.close();
            }
            if (httpResponse != null) {
                httpResponse.close();
            }
            if (httpPost != null) {
                httpPost.clone();
            }
        }
        return null;
    }

加密:

 	public static String MessageDigest(String url) throws UnsupportedEncodingException {
        String clientSystemId = "test";
        Long timestamp = System.currentTimeMillis();
        Double nonce = Math.random();

        //字典序排序
        String[] arr = {clientSystemId, timestamp.toString(), nonce.toString()};
        Arrays.sort(arr);
        //按排序后的前后顺序连成串
        StringBuffer buf = new StringBuffer();
        buf.append(arr[0]).append(arr[1]).append(arr[2]);
        String befStr = buf.toString();
        //SHA1加密
        String mySignature = DigestUtils.shaHex(befStr.getBytes());

        String parameter = "?signature=" + urlParameterEncode(mySignature) +
                "&timestamp=" + urlParameterEncode(timestamp.toString()) +
                "&nonce=" + urlParameterEncode(nonce.toString()) +
                "&clientSystemId=" + urlParameterEncode(clientSystemId);

        url += parameter;
        return url;
    }

参数编码(UTF-8方式):

  public static String urlParameterEncode(String urlParameter) throws UnsupportedEncodingException {
        return java.net.URLEncoder.encode(urlParameter, "UTF-8");
    }

到此,完毕!

在PHP中使用法信公证签进行签名加密请求数据的一般过程如下: 1. **安装依赖**: 首先,你需要安装法信公证签的官方库或者通过Composer管理第三方包,例如: ```shell composer require aliyun/fc-signature-sdk ``` 2. **初始化配置**: 获取法信公证签相关的公钥(如AccessKey ID和Secret Access Key)并创建一个SDK实例: ```php use AlibabaCloud\Signature\FcSignature; $fcSignature = new FcSignature([ 'accessKeyId' => 'your_access_key_id', 'accessKeySecret' => 'your_secret_access_key' ]); ``` 3. **准备请求数据**: 定义你要发送的数据,比如一个JSON对象或数组: ```php $data = [ 'name' => 'John Doe', 'email' => 'john@example.com' ]; ``` 4. **加密数据**: 使用法信公证签对数据进行加密,这通常是自动进行的,如果你选择的是签名加密功能: ```php // 如果法信公证签提供了一键加密的API,如encryptData() $encryptedData = $fcSignature->encryptData($data); ``` 5. **签名请求**: 对加密后的数据和一些附加信息(如请求方法、URL等)生成签名: ```php $toSignParams = [ 'method' => 'POST', 'uri' => 'https://api.example.com/users/create', 'body' => $encryptedData, // 可能还包括其他必要的头部信息 ]; $signature = $fcSignature->createSignature($toSignParams); ``` 6. **构建最终请求**: 将签名加入到HTTP请求头中,然后发起HTTPS请求: ```php $options = [ 'http' => [ 'header' => "Content-Type: application/json\r\nAuthorization: Signature {$signature}\r\n" ] ]; $context = stream_context_create($options); $result = file_get_contents('https://api.example.com/users/create', false, $context); ``` 7. **接收响应**: 对于服务器的响应,你可以解析它以获取是否成功,并根据返回的信息进行后续处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值