?下载官方SDK
????????使用 PHP 包管理工具?Composer?安装 SDK:
????????composer require wechatpay/wechatpay
https://github.com/wechatpay-apiv3/wechatpay-phphttps://github.com/wechatpay-apiv3/wechatpay-php
下载IDE 描述包
为 wechatpay-php 增加IDE提示的接口描述包 iwechatpay/openapi 介绍 | 微信开放社区wechapay-php 开发包的辅助包 iwechatpay/openapi 介绍https://developers.weixin.qq.com/community/develop/article/doc/000a0ce867842092f8cc65e5356013
开始使用
? ? ? ? 实例化 配置好参数
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,
],
]);
平台证书下载
????????微信支付SDK 中 PHP Certificate Downloader 微信支付 APIv3 平台证书的命令行下载工具 使用教程_fuchto的博客-CSDN博客使用环境在linux 环境中使用使用前准备商户号、商户证书序列号、商户私匙文件(pem格式)、ApiV3密钥安装好 微信支付SDK 使用composer安装composer require wechatpay/wechatpayApiV3 密钥设置什么是APIv3密钥?如何设置?第一步 进入对应项目目录根目录 校验composer 是否可用输入命令 composer -v 第二步 查询当前可用命...https://blog.csdn.net/fuchto/article/details/122946465官方文档:
????????微信支付-开发者文档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 是因为请求时 参数出现了问题 注意 对照一下 返回的参数和 请求的参数之间的区别
|