php xml转数组微信支付
时间: 2025-01-31 17:03:57 浏览: 44
### PHP XML 转换为数组用于微信支付实现
在处理来自微信服务器的消息时,通常会接收到 XML 格式的字符串。为了方便操作这些数据,在 PHP 中可以先将其转换成数组形式再做进一步处理。
#### 使用 simplexml_load_string 和 json_decode 方法
一种常见的方式是利用 `simplexml_load_string` 函数加载 XML 字符串并转为其对象表示,之后借助于 JSON 编码解码过程间接达到目的:
```php
function xmlToArray($xmlString) {
$xmlObject = simplexml_load_string($xmlString);
$json = json_encode($xmlObject);
return json_decode($json, true);
}
```
此方法能够有效地把简单的 XML 文档映射到关联数组结构上[^1]。
对于更复杂的场景或者当遇到命名空间等问题时,则可能需要用到 SimpleXMLElement 类及其迭代器特性来遍历节点构建自定义解析逻辑。
另外值得注意的是,由于微信支付接口返回的数据可能会包含特殊字符或编码差异,因此建议在实际应用前测试不同情况下的兼容性和稳定性,并考虑加入错误捕获机制确保程序健壮性。
相关问题
app微信支付PHP后端代码
以下是一个使用 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`:支付结果通知地址,根据实际情况填写。
用php写一个app微信支付服务端请求prepayId的代码
好的,以下是用PHP请求微信支付服务端获取prepayId的代码:
```php
<?php
// 微信支付接口调用代码
$APPID = 'Your APPID'; // APPID
$MCHID = 'Your MCHID'; // 商户号
$KEY = 'Your KEY'; // API密钥
$APPSECRET = 'Your APPSECRET'; // APP密钥
// 请求微信支付接口获取prepay_id
function getPrepayId($body, $out_trade_no, $total_fee, $notify_url, $openid) {
global $APPID, $MCHID, $KEY, $APPSECRET;
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$data = array(
'appid' => $APPID,
'mch_id' => $MCHID,
'nonce_str' => md5(uniqid()),
'body' => $body,
'out_trade_no' => $out_trade_no,
'total_fee' => $total_fee,
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
'notify_url' => $notify_url,
'trade_type' => 'JSAPI',
'openid' => $openid,
);
// 签名
ksort($data);
$stringA = '';
foreach ($data as $key => $value) {
if ($key != 'sign' && $value != '') {
$stringA .= $key . '=' . $value . '&';
}
}
$stringA .= 'key=' . $KEY;
$sign = strtoupper(md5($stringA));
$data['sign'] = $sign;
$xml = arrayToXml($data);
$response = postXmlCurl($xml, $url);
$result = xmlToArray($response);
return $result['prepay_id'];
}
// 数组转XML
function arrayToXml($arr) {
$xml = '<xml>';
foreach ($arr as $key => $val) {
if (is_numeric($val)) {
$xml .= '<' . $key . '>' . $val . '</' . $key . '>';
} else {
$xml .= '<' . $key . '><![CDATA[' . $val . ']]></' . $key . '>';
}
}
$xml .= '</xml>';
return $xml;
}
// XML转数组
function xmlToArray($xml) {
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
// post请求
function postXmlCurl($xml, $url, $second = 30) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf-8'));
$data = curl_exec($ch);
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new Exception("curl出错,错误码:$error");
}
}
?>
```
你可以根据需要修改 `$APPID`、`$MCHID`、`$KEY` 和 `$APPSECRET` 等参数。使用示例:
```php
$body = '测试商品'; // 商品描述
$out_trade_no = '201810240001'; // 商户订单号
$total_fee = '1'; // 商品总金额,单位为分
$notify_url = 'https://www.example.com/notify'; // 通知地址
$openid = 'oVhVFuFv3JG1kxVpPvRJy8LZfQfg'; // 用户openid
$prepay_id = getPrepayId($body, $out_trade_no, $total_fee, $notify_url, $openid);
echo $prepay_id;
```
以上代码仅供参考,实际使用中需要根据自己的业务逻辑进行修改和完善。
阅读全文
相关推荐
















