php v3 调用微信支付 附上完整代码
时间: 2023-09-08 08:16:49 浏览: 422
以下是 PHP v3 版本调用微信支付的示例代码:
```php
<?php
/**
* 微信支付 V3 版本 PHP 示例代码
*
* 注意:此代码仅供参考,请根据实际情况进行修改。
*
* @link https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_1.shtml 微信支付 V3 版本文档
*/
// 设置请求参数
$method = 'POST'; // 请求方法
$url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi'; // 请求地址
$timestamp = time(); // 时间戳
$nonceStr = 'e61463f8efa94090b1f366cccfbbb444'; // 随机字符串
$merchantId = '1234567890'; // 商户号
$serialNo = 'E3B4E6D1F8E4A5B6'; // 商户证书序列号
$privateKeyPath = '/path/to/private/key.pem'; // 商户私钥证书路径
$body = '{"description":"iPad mini 5 Wi-Fi 64G","out_trade_no":"1217752501201407033233368018","amount":{"total":100,"currency":"CNY"},"payer":{"openid":"o3IHGjlXXXXXj1asdlXXXXXXXXXX"},"notify_url":"https://www.example.com/wechatpay/notify"}'; // 请求体
// 生成签名
$signHeaders = [
'accept' => 'application/json',
'content-type' => 'application/json',
'user-agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
'host' => 'api.mch.weixin.qq.com',
];
$signBody = $method . "\n" . $url . "\n" . $timestamp . "\n" . $nonceStr . "\n" . $body . "\n";
$sign = generateSign($signBody, $signHeaders, $merchantId, $serialNo, $privateKeyPath);
// 发送请求
$headers = [
'accept: application/json',
'content-type: application/json',
'user-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
'authorization: WECHATPAY2-SHA256-RSA2048 mchid="' . $merchantId . '",nonce_str="' . $nonceStr . '",signature="' . $sign . '",timestamp="' . $timestamp . '",serial_no="' . $serialNo . '"',
];
$response = sendRequest($method, $url, $headers, $body);
// 解析响应
$result = json_decode($response, true);
if ($result['code'] == 0 && $result['message'] == 'OK') {
echo '预支付会话标识:' . $result['prepay_id'];
} else {
echo '请求失败:' . $result['message'];
}
/**
* 生成签名
*
* @param string $signBody 待签名字符串
* @param array $signHeaders 待签名的 HTTP 头部信息
* @param string $merchantId 商户号
* @param string $serialNo 商户证书序列号
* @param string $privateKeyPath 商户私钥证书路径
* @return string 签名
*/
function generateSign($signBody, $signHeaders, $merchantId, $serialNo, $privateKeyPath) {
$privateKey = openssl_get_privatekey(file_get_contents($privateKeyPath));
$signature = '';
foreach ($signHeaders as $key => $value) {
$signature .= $key . ': ' . $value . "\n";
}
$signature .= $signBody;
openssl_sign($signature, $sign, $privateKey, OPENSSL_ALGO_SHA256);
$signature = base64_encode($sign);
return $signature;
}
/**
* 发送请求
*
* @param string $method 请求方法
* @param string $url 请求地址
* @param array $headers 请求头部信息
* @param string $body 请求体
* @return string 响应内容
*/
function sendRequest($method, $url, $headers, $body) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
```
这段示例代码实现了以下功能:
1. 设置请求参数,包括请求方法、请求地址、时间戳、随机字符串、商户号、商户证书序列号、商户私钥证书路径、请求体等。
2. 生成签名,包括签名字符串、HTTP 头部信息、商户号、商户证书序列号、商户私钥证书等。
3. 发送请求,包括请求方法、请求地址、请求头部信息、请求体等。
4. 解析响应,根据返回结果获取预支付会话标识等信息。
使用此示例代码前,请确保已经获取了微信支付 V3 版本相关证书,并将证书放置到正确的路径下。
阅读全文