app微信支付PHP后端代码
时间: 2023-10-17 18:05:16 浏览: 49
以下是一个使用 PHP 实现微信支付的后端代码示例:
```php
<?php
// 微信支付 API 地址
$api_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// 商户号
$merchant_id = "your_merchant_id_here";
// 应用 ID
$app_id = "your_app_id_here";
// API 密钥
$api_key = "your_api_key_here";
// 订单信息
$order = array(
"body" => "订单描述",
"out_trade_no" => "订单号",
"total_fee" => 100, // 订单金额,单位为分
"spbill_create_ip" => $_SERVER['REMOTE_ADDR'], // 用户 IP 地址
"notify_url" => "https://example.com/notify.php", // 支付结果通知地址
"trade_type" => "JSAPI", // 支付方式,公众号支付填 JSAPI
"openid" => "用户的openid",
);
// 生成签名
$order["appid"] = $app_id;
$order["mch_id"] = $merchant_id;
$order["nonce_str"] = uniqid();
$order["sign"] = generate_sign($order, $api_key);
// 转换为 XML 格式
$xml = array_to_xml($order);
// 发送请求
$response = send_request($api_url, $xml);
// 处理响应
$result = xml_to_array($response);
if ($result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") {
// 获取 prepay_id
$prepay_id = $result["prepay_id"];
// 构造 JSAPI 支付参数
$jsapi_params = array(
"appId" => $app_id,
"timeStamp" => time(),
"nonceStr" => uniqid(),
"package" => "prepay_id=" . $prepay_id,
"signType" => "MD5",
);
// 生成签名
$jsapi_params["paySign"] = generate_sign($jsapi_params, $api_key);
// 返回 JSAPI 支付参数
echo json_encode($jsapi_params);
} else {
// 支付失败
echo "支付失败:" . $result["return_msg"];
}
// 生成签名函数
function generate_sign($data, $key) {
// 去除空值和签名字段
$filtered_data = array_filter($data, function ($value, $key) {
return $key != "sign" && $value != "";
}, ARRAY_FILTER_USE_BOTH);
// 按照键名升序排序
ksort($filtered_data);
// 拼接成字符串
$string = urldecode(http_build_query($filtered_data)) . "&key=" . $key;
// 计算 MD5 哈希值
return strtoupper(md5($string));
}
// 数组转 XML 格式函数
function array_to_xml($data) {
$xml = "<xml>";
foreach ($data as $key => $value) {
if (is_numeric($value)) {
$xml .= "<$key>$value</$key>";
} else {
$xml .= "<$key><![CDATA[$value]]></$key>";
}
}
$xml .= "</xml>";
return $xml;
}
// XML 转数组格式函数
function xml_to_array($xml) {
$data = array();
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xml, $values);
xml_parser_free($xml_parser);
foreach ($values as $value) {
if ($value["type"] == "complete") {
$data[$value["tag"]] = $value["value"];
}
}
return $data;
}
// 发送请求函数
function send_request($url, $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
```
需要替换的内容:
- `$merchant_id`:商户号。
- `$app_id`:应用 ID。
- `$api_key`:API 密钥。
- `$order`:订单信息,根据实际情况填写。
- `$api_url`:微信支付 API 地址,根据实际情况填写。
- `https://example.com/notify.php`:支付结果通知地址,根据实际情况填写。