下载官方SDK
使用 PHP 包管理工具 Composer 安装 SDK:
composer require wechatpay/wechatpay
https://github.com/wechatpay-apiv3/wechatpay-phphttps://github.com/wechatpay-apiv3/wechatpay-php
下载IDE 描述包
开始使用
实例化 配置好参数
require_once('vendor/autoload.php');
use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;
// 设置参数
// 商户号
$merchantId = '190000****';
// 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
$merchantPrivateKeyFilePath = 'file:///path/to/merchant/apiclient_key.pem';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = '3775B6A45ACD588826D15E583A95F5DD********';
// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = 'file:///path/to/wechatpay/cert.pem';
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
// 从「微信支付平台证书」中获取「证书序列号」
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
// 构造一个 APIv3 客户端实例
$instance = Builder::factory([
'mchid' => $merchantId,
'serial' => $merchantCertificateSerial,
'privateKey' => $merchantPrivateKeyInstance,
'certs' => [
$platformCertificateSerial => $platformPublicKeyInstance,
],
]);
平台证书下载
微信支付-开发者文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_18.shtml开始请求
$item = "当获取到投诉资料信息后获取到的 media_url";
$urlInfo = (parse_url($item));
// 获取请求的路径 参数
$media_slot_url = str_replace('/v3/merchant-service/images/','',$urlInfo['path']);
try {
// $stack 是因为 使用官方 SDK时 由于 sdk 会自动进行验签 而官方返回的是数据流并不用验签 所以需要特殊处理 在请求时加入 ['handler' => $stack]
$stack = clone $instance->getDriver()->select()->getConfig('handler');
$stack->remove('verifier');
// 下载接口都是非标接口,要特殊搞一下 要 {+media_slot_url} 这样的语法结构
$res = $instance->chain('v3/merchant-service/images/{+media_slot_url}')->get([
'handler' => $stack,
'media_slot_url'=>$media_slot_url,
]);
$filename = time().rand(9999,99999).'.jpg';
// 获取图片资源
$file = $res->getBody();
// 保存图片到本地
$info = $this->saveImage("./public/upload/media",$filename,$file);
}catch (RequestException $e){
echo $e->getMessage()."\n";
echo $e->getResponse()->getBody();
}
// 保存图片到本地
function saveImage($save_dir = './public/upload/loan',$filename='image.jpg',$file)
{
if(trim($save_dir)=='')
$save_dir='./';
if(0!==strrpos($save_dir,'/'))
$save_dir.='/';
//创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true))
return array('file_name'=>'','save_path'=>'','error'=>5);
$resource = fopen($save_dir . $filename, 'a');
fwrite($resource, $file);
fclose($resource);
unset($file,$url);
return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
}
为什么使用 {+media_slot_url} 语法结构
请求后响应
The response's Headers incomplete, must have(`Wechatpay-Nonce`, `Wechatpay-Serial`, `Wechatpay-Signature` and `Wechatpay-Timestamp`).
failed,resp code = 200 return body =
是因为没有加入 $stack 进行特殊处理 sdk 进行了 验签 返回值是binary 图片流,不用验签
报错 400 是因为请求时 参数出现了问题 注意 对照一下 返回的参数和 请求的参数之间的区别
其他測試用例