收藏
回答

php使用同城配送时接入微信api安全出错,报错:934011,怎么解决?

报错信息:string(86) "{"errcode":934011,"errmsg":"request_body is required rid: 64adfa6f-4b7c30ee-0a560363"}"


我的代码:其中app_id local_sn local_key等均已省略


<?php
namespace backend\modules\v4\controllers;
use backend\components\BaseApiController;
use backend\components\helper\WxDelivery;


class TestController extends BaseApiController
{
    private $param = [
        'app_id' => '',
        'url' => 'https://api.weixin.qq.com/cgi-bin/express/intracity/balancequery',
        'local_sn' => '',
        'local_key' => '',
        'store_id' => '',
        'out_store_id' => '',
    ];
    private $key =[
        'sn'=>'',
        'key'=>'-----BEGIN RSA PRIVATE KEY-----
省略
-----END RSA PRIVATE KEY-----'
    ];
    public function actionTest()
    {
        $param = $this->param;
        $accessToken = WxDelivery::getAccessToken();
        $url = $this->param['url'] . "?access_token=" . $accessToken;
        $newRe = $this->getRequestParam();
        $signature = $this->getSignature($newRe);
        $headerArray =['Wechatmp-Appid'=>$param['app_id'],'Wechatmp-TimeStamp'=>$newRe['ts'],'Wechatmp-Signature'=>$signature];
        $data = WxDelivery::curlPost($url, $newRe['reqData'],$headerArray);
        var_dump($data);
    }

    public function getRequestParam()
    {
        $param = $this->param;
        // $param['local_key'] = base64_decode($param['local_key']);
        $req = ['store_id' => $param['store_id'], 'out_store_id' => $param['out_store_id']];
        $time = time();
        //16位随机字符串
        $nonce = rtrim(base64_encode(random_bytes(16)), '=');
        $addReq = ["_n" => $nonce, "_appid" => $param['app_id'], "_timestamp" => $time];
        $realReq = array_merge($addReq, $req);
        $realReq = json_encode($realReq);
        //额外参数
        $aad = $param['url'] . "|" . $param['app_id'] . "|" . $time . "|" . $param['local_sn'];
        //12位随机字符
        $iv = random_bytes(12);
        $cipher = openssl_encrypt($realReq, "aes-256-gcm", $param['local_key'], OPENSSL_RAW_DATA, $iv, $tag, $aad);
        $iv = base64_encode($iv);
        $data = base64_encode($cipher);
        $authTag = base64_encode($tag);
        $reqData = ["iv" => $iv, "data" => $data, "authtag" => $authTag];
        return ['ts' => $time, 'reqData' => json_encode($reqData)];


    }
    public function getSignature($newRe)
    {
        $param = $this->param;
        $keys = $this->key;
        $time = $newRe['ts'];
        $url = $param['url'];
        $appId = $param['app_id'];
        $reqData = $newRe['reqData'];
        $payload = "$url\n$appId\n$time\n$reqData";
        $key = openssl_pkey_get_private($keys['key']);
        $signature = '';
        openssl_sign($payload, $signature, $key, OPENSSL_ALGO_SHA256);
        openssl_free_key($key);
        return base64_encode($signature);
    }
}


<?php


namespace backend\components\helper;

use common\helpers\MiniHelper;

class WxDelivery
{
    /**
     * Name:获取小程序的token
     * User: zcw
     * Date: 2023/7/11
     * Time: 9:50
     * @return bool|int|mixed|string
     */
    public static function getAccessToken()
    {
        $qr = new MiniHelper();
        // 获取到的 access_token
        return $qr->getAccessToken();
    }

    public static function curlPost($url, $field,$header)
    {
        $headerArray = array("Content-type:application/json;charset=utf-8", "Accept:application/json");
        $headerArray = array_merge($headerArray,$header);
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headerArray);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $field);
        $str = curl_exec($curl);
        curl_close($curl);
        return $str;
    }
回答关注问题邀请回答
收藏

2 个回答

  • I'm Henry
    I'm Henry
    2023-07-12

    麻烦确认请求的header中以下几个字段是否被正确携带

    Wechatmp-Appid
    Wechatmp-TimeStamp
    Wechatmp-Signature
    
    


    2023-07-12
    有用
    回复 8
    • I'm Henry
      I'm Henry
      2023-07-12
      目前是没有正确携带者几个验签字段,导致后台没有触发验签和解密的逻辑
      2023-07-12
      回复
    • 😀
      😀
      2023-07-12回复I'm Henry
      你好 确实是header参数携带有问题,已经修改了 ,改报签名异常这个错误了编码 40234,从代码来看我的写法有存在异常的地方吗
      2023-07-12
      回复
    • 😀
      😀
      2023-07-12回复😀
      生成签名的过程存不存在其他问题呢,因为群里有另外一位跟我情况一样
      2023-07-12
      回复
    • I'm Henry
      I'm Henry
      2023-07-13回复😀
      不存在其他问题,已经有商家跑通全流程
      2023-07-13
      回复
    • 可乐阿
      可乐阿
      2023-09-23回复😀
      老哥解决了吗?我这也是 40234 invalid signature  签名未生效错误
      2023-09-23
      回复
    查看更多(3)
  • 可乐加冰
    可乐加冰
    01-09

    解决了不,我的也是40234 invalid signature rid: 659d0244-4fe369a9-6e05edfc

    01-09
    有用
    回复
登录 后发表内容