用php写一个调用微信支付的函数
时间: 2023-05-27 19:04:07 浏览: 114
以下是示例代码,供您参考:
```
/**
* 调用微信支付的函数
* @param string $apiUrl 支付接口的URL地址
* @param array $params 支付参数
* @return array 支付结果
*/
function callWechatPay($apiUrl, $params) {
// 根据微信支付接口文档的要求,需要对参数进行签名
$params['sign'] = generateWechatPaySign($params);
// 将参数转换成XML格式
$data = arrayToXml($params);
// 发送HTTP请求,并获取响应结果
$response = sendHttpRequest($apiUrl, $data);
// 将响应结果解析成数组格式
$result = xmlToArray($response);
// 检查返回结果,如果出现错误,则抛出异常
if ($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') {
throw new Exception($result['return_msg']);
}
// 返回支付结果
return $result;
}
/**
* 生成微信支付签名
* @param array $params 待签名参数
* @return string 签名结果
*/
function generateWechatPaySign($params) {
// 将参数按照键名从小到大排序
ksort($params);
// 拼接成URL格式的字符串
$queryString = http_build_query($params);
// 在字符串末尾追加商户支付密钥
$queryString .= '&key=' . WECHAT_PAY_KEY;
// 对字符串进行MD5加密,并转换成大写字母
return strtoupper(md5($queryString));
}
/**
* 将数组转换成XML格式
* @param array $data 待转换的数组
* @return string 转换后的XML字符串
*/
function arrayToXml($data) {
$xml = '<xml>';
foreach ($data as $key => $value) {
$xml .= "<$key><![CDATA[$value]]></$key>";
}
$xml .= '</xml>';
return $xml;
}
/**
* 将XML格式的字符串转换成数组
* @param string $xml 待转换的XML字符串
* @return array 转换后的数组
*/
function xmlToArray($xml) {
$data = array();
// 加载XML字符串
$xmlObj = simplexml_load_string($xml);
// 将XML对象转换成数组
foreach ($xmlObj as $key => $value) {
$data[$key] = strval($value);
}
return $data;
}
/**
* 发送HTTP请求并获取响应结果
* @param string $url 请求的URL地址
* @param string $data 请求数据
* @return string 响应结果
*/
function sendHttpRequest($url, $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
```
在使用时,您需要替换示例代码中的WECHAT_PAY_KEY常量为您自己的商户支付密钥,并以以下方式调用函数:
```
// 调用统一下单接口,并获取支付链接
$params = array(
'appid' => 'wx1234567890',
'mch_id' => '1234567890',
'nonce_str' => uniqid(),
'body' => '测试商品',
'out_trade_no' => '201910290001',
'total_fee' => '1',
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
'notify_url' => 'http://example.com/wechatpay/notify.php',
'trade_type' => 'JSAPI',
'openid' => 'o5f5G5a7GzGaQeWWbZLwvuZfwbGc',
);
$result = callWechatPay('https://api.mch.weixin.qq.com/pay/unifiedorder', $params);
$prepayId = $result['prepay_id'];
$payUrl = "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=$prepayId";
```
阅读全文