TP8官方文档
序言 - ThinkPHP官方手册
EasyWeChat6
EasyWeChat - 一个 PHP 微信开发 SDK | EasyWeChat
官方文档
微信支付开发者文档
安装使用
因为本人用的是 ThinkCMF的框架,来接入微信支付,但是WX官方的文档,本人能力确实有限看的有点😵😵😵。果断选择插件来实现,因为之前接入过 4.x,5.x。 觉得EasyWeChat还是一个很不错的插件。随着WX支付的更新,V2逐渐被淘汰,5.x本身是不支持V2
6. x的变化还是比较大,可以自身参考 上面的链接的文档。。
我本身接入的是native 扫码支付 请看下面的代码
所有的代码可以写在一个类里面
这些配置参考,微信支付的官方文档进行申请以及配置
这个里面 证书 和 私钥 可以写地址
例:'private_key' => CMF_ROOT . 'public\certs\apiclient_key.pem'也可以直接明文或者写成配置类,但是本人在测试中,发现一个有一个问题,就是写地址的时候本地测试是没问题的,但是部署到服务器上就会提示 ‘证书错误’,在网上查询了很多的资料,其中可能的是证书中存在空格,但是本人在测试中,确实发现证书最后存在一个换行符号,但是删除还是不管用。如果有解决方案,感谢大佬🙇🙇🙇
解决方案:
我是直接写成配置类或者写成明文这个问题就会消失。(超级🍳)
<?php
use EasyWeChat\Pay\Application;
$config = [
'mch_id' => 1360649000,
// 商户证书 和 私钥
'private_key' => __DIR__ . '/certs/apiclient_key.pem',
'certificate' => __DIR__ . '/certs/apiclient_cert.pem',
// v3 API 秘钥
'secret_key' => '43A03299A3C3FED3D8CE7B820Fxxxxx',
// v2 API 秘钥
'v2_secret_key' => '26db3e15cfedb44abfbb5fe94fxxxxx',
// 平台证书:微信支付 APIv3 平台证书,需要使用工具下载
// 下载工具:https://github.com/wechatpay-apiv3/CertificateDownloader
'platform_certs' => [
// 请使用绝对路径
// '/path/to/wechatpay/cert.pem',
],
/**
* 接口请求相关配置,超时时间等,具体可用参数请参考:
* https://github.com/symfony/symfony/blob/5.3/src/Symfony/Contracts/HttpClient/HttpClientInterface.php
*/
'http' => [
'throw' => true, // 状态码非 200、300 时是否抛出异常,默认为开启
'timeout' => 5.0,
// 'base_uri' => 'https://api.mch.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri
],
];
$app = new Application($config);
下面就是native 支付的连接 ,需要注意的是,在本地的环境地址,回调地址是测不了的,
需要部署到服务上然后进行测试。
$data 是我的配置 ,我没有写成配置类直接存到数据库里,页面可修改
public function pay()
{
///和获配置类
$app = $this->config();
$data = WxConfigfModel::find('1');
//获得订单号
$orderNo = '202407051532';
$response = $app->getClient()->postJson('v3/pay/transactions/native', [
'mchid' => $data['mchid'],
'out_trade_no' => $orderNo,
'appid' => $data['appid'],
'description' => $data['description'],
'notify_url' => $data['notify_url'], //回调地址
'amount' => [
'total' => 2,//费用
'currency' => 'CNY',
]
]);
return json($response->toArray(false));
}
订单的查询
//查询订单
public function selectOrder($order_no) //订单号
{ //获得配置类
$app = $this->config();
$data = WxConfigfModel::find('1');
$outTradeNo = $order_no;
$response = $app->getClient()->get("v3/pay/transactions/out-trade-no/{$outTradeNo}", [
'query' => [
'mchid' => $data['mchid']
]
]);
return json($response->toArray());
}
订单的退款
//订单退款
public function refund($order_no,$pay_amount,$start_amount)
{
//三个参数 分别是 订单号 退款金额,订单金额
// 获取配置类
$app = $this->config();
// 查询数据库获取配置信息
$data = WxConfigfModel::find('1');
// 构建退款请求数据
// 发起退款请求
$response = $app->getClient()->postJson('v3/refund/domestic/refunds', [
"out_trade_no" => $order_no,
"out_refund_no" => time().rand(10000,99999),
"reason" => "商品已售完",
"notify_url"=> data['refund_notify_url'],
"amount" => [
"refund" => (int)$pay_amount,
"total" => (int)$start_amount,
"currency" => "CNY"
]
]);
// 返回退款请求的结果
// return json($response->toArray());
}
至此,一套流程就完毕了,支付--查询--退款,希望可以帮助大家👍👍👍