场景:使用微信的同城配送时,官方告知这个服务相关接口必须走api加密,由于demo无php案例,所以根据node.js案例自己写了一下,结果是报:934011错误,下面是报错图图片以及我的完整代码,麻烦解答一下:
代码如下:
<?php
namespace backend\modules\v4\controllers;
use backend\components\BaseApiController;
use backend\components\helper\WxDelivery;
class TestController extends BaseApiController
{
private $param = [
'app_id' => 'wx223dc21d5412f0c0',
'url' => 'https://api.weixin.qq.com/cgi-bin/express/intracity/balancequery',
'local_sn' => '3e2afefa0811f4fab71c753512dd7ef',
'local_key' => 'Y3fb15WAXyxnYJEMpuGy+Xw6ryk0GLNeLel9R25ZyY=',
'store_id' => '',
'out_store_id' => '',
];
private $key =[
'sn'=>'29866c9f9eac9de2b238ee37da264031',
'key'=>'-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEAyXq3vE7LOiLHyNXR761A2+6fBrqFG1hQXiSrIJ3t9wtHqarI
jsoSeW2qxK7C+82goYl5cNe22MgoTCqB6RQJ7LcbFTGTMkXStZHYqTyWLnHwmgp
3D2yW60ZwKuqy3NfoIg91WhOg/VkojAVSjoNOSmG75nmOeSlMPMKnEj1URIu4Lvj
ATOVFJFMp3rkOGP8wv7w7UaDm7AVaEIhZtTw5a8cgeOAH01ftroGjQ7SWLTRiU2h
rsDb/k07qL60T3CIzJWO1auv9CnygacyziYLY67rEYmadu4TIRn6ddLSqQ+iDWKw
3sta3jSxiJ+fx0OlpjwIG8OOtrtMcJrGW+7p8QIDAQABAoIBAQCPW2D2fL3/jJXI
odMxjX3zvzKpz/c7wLfWdJLKr3SNbho8cAcqCj/g5JY4Qfz8u4/KwI2HLAWu86QM
YGLq8xARXyOVdTBvnDmVhyfd2W2SkgW/nuwCCGgq8Ny9CaiKAHqPN8F/YitTmzxS
ZpIPcYTNIm4fd8qncLfVP2lSUFs0pc8kOjnOI29QhbkqPye+iyPj2Tayo0lmEehx
UwxOlmlJTspx11VasHhymjAJcZC2qvd4bkzDWuS73CR5GLF8MGELCOtaSUv15vMu
ttfz0tgnI6xY0Nenf+CoeE2CI3wwjGtXXV9ieMELG6R/RHJOVxKeP7yUUDkJrmot
RK1pt3wRAoGBAOlKSJe4+WquPLKkmHZj9dh61pBzTtNuZ0gbigSm6lrt308zw6gs
FUqwey2/qtcADSxWawdiymiaKDQF0Ddd29cgup1SEk3ES/tEIGvtqhSWUKo/w356
Y2MgfrhrzvfI9Ir5nsPRaEPNhyfJQ70wXva26ZLdn9BLPxDMgQe66UkNAoGBAN0X
sRrTgUHpyqnxcl/gSJluXe709qwfldsDH87Isj5ZwFUwHiVmz2If0cqzZHxsfd3H
9Z5je71is5Q563AesTJFKqvXKbp4GSm7nlucgmBcv8X2qj7VpfdMRMUhWOLq/pTm
0i3d9X9oOioPETa0/g1s6EdQWcpBsvfZDTJLMuN1AoGBAJFWewUy8wgYRq5Qxr8z
JU1ZseTKQXiNVoDgz0p4ppZBjZatPB7AX/9pFUR6HTfWy14s9H7keA9UwukuGfr0
WWqb9Ebgg5C5U1DVr5EtvoEW6Gg4U1Wvb82ox+mjGIzcQCV4wAVkp51eJO6Pf8kU
ooT3jWq28cJ1rnOLxHMJah7dAoGBAJ+CIkJKaazWMWLeUTgepgIcACUQEo8n0oPK
Az66yO327q4HIxi0zdXrQv5M4qhp1X0WcHwvJe0CsrC0AMpJOmocQKbtequPTggv
1hYeGmnPQIRga38dwLlkCxF195zvEXD3/pcc1atv1NbXPAIOHmQtOH+K1tz2/VmW
/NBWNIapAoGBAKQ7Wg63RZ7mSqKf/LW9siIPVufwoIOhBXthxx2JHVZYk0VOuCpz
hLj52lT90tJbd5GwvGWoem+1VWFtn/b+6YYs22lCZ921cSJWP1EDH0KpLicisD87
Qb1UzmUf8CasGh71djmqVBEemCQ3kdUMWWczoQC8op0UG9Jl0xzVNUyn
-----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;
}
public static function curlGet()
{
}
}
