环境要求
PHP >= 7.4 PHP cURL 扩展 PHP OpenSSL 扩展 PHP SimpleXML 扩展 PHP fileinfo 拓展
安装
$ composer require overtrue/wechat:~5.0 -vvv
使用
use EasyWeChat\Factory;
// ------------------------
$config = [
// 必要配置
'app_id' => 'xxxx', //小程序ID
'mch_id' => 'your-mch-id', //商家ID
'key' => 'key-for-signature', // API 密钥
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
'key_path' => 'path/to/your/key', // XXX: 绝对路径!!!!
'notify_url' => '默认的订单回调地址', // 你也可以在下单时单独设置来想覆盖它
];
// ------------------------
$app = Factory::payment($config);
$res = $app->order->unify([
'body' => $desc, //商品简介
'out_trade_no' => $order_code, //订单号
'total_fee' => floatval($info->pay_fee * 100), //价格 单位为分
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => $wx_config['notify_url'], // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
'openid' => $user_info->openid, //用户的openid
]);
// ------------------------
if ($res['return_code'] == 'FAIL') return $this->error_back(-1, '预支付请求失败' . $res['return_msg'], []);
// ------------------------
$pay_time = time();
$appId = $res['appid'];
$nonceStr = $res['nonce_str'];
$prepay_id = $res['prepay_id'];
$timeStamp = $pay_time;
$key = $wx_config['md5_key'];
// ------------------------
$paySign = md5("appId=$appId&nonceStr=$nonceStr&package=prepay_id=$prepay_id&signType=MD5&timeStamp=$timeStamp&key=$key"); // 这个地方就是我所说的二次签名!
// ------------------------
// 返回给小程序
$re = [];
$re['nonceStr'] = $nonceStr;
$re['timeStamp'] = strval($timeStamp); // 小程序支付的timeStamp参数,必须使用这个 timeStamp,因为已经计算到了paySign中
$re['package'] = "prepay_id=" . $prepay_id;
$re['paySign'] = $paySign;
$re['signType'] = 'MD5';
// ------------------------
//自己的操作逻辑部分--- 然后返回给前端
// ------------------------
return $this->success_back(200, 'success', $re);
回调
/**
*
* 支付回调地址
*/
public function NotifyPayApi(Request $request)
{
$wx_config = config("app.wx_pay");
$config = [
// 必要配置
'app_id' => $wx_config['app_id'],
'mch_id' => $wx_config['mch_id'],
'key' => $wx_config['md5_key'], // API 密钥
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => '', // XXX: 绝对路径!!!!
'key_path' => '', // XXX: 绝对路径!!!!
'notify_url' => $wx_config['notify_url'], // 你也可以在下单时单独设置来想覆盖它
];
$app = Factory::payment($config);
$response = $app->handlePaidNotify(function ($message, $fail) {
if ($message['result_code'] == 'SUCCESS' && $message['return_code'] == 'SUCCESS') {
$order_sn = $message['out_trade_no']; // 订单单号
$openid = $message['openid']; // 付款人openID
$total_fee = ($message['total_fee']) / 100; // 付款金额
$transaction_id = $message['transaction_id']; // 微信支付流水号
$order_info = $this->FindOrderByOrderCode($order_sn);
if (empty($order_info)) return false;
// 更新订单
try {
DB::beginTransaction();
//数据库逻辑
//插入流水
DB::commit();
return true;
} catch (\Exception $e) {
Db::rollBack();
return false;
}
} else {
return false;
}
});
return $response;
}
就这么简单
踩坑的地方就是拿到了 prepay_id 之后居然还要二次签名 最后附上EasyWechat的官方地址 https://www.easywechat.com/5.x/payment/