Home  >  Article  >  Backend Development  >  How to use PHP to implement WeChat payment statement inquiry

How to use PHP to implement WeChat payment statement inquiry

PHPz
PHPzOriginal
2023-05-13 20:51:041935browse

With the popularity of mobile payment, WeChat payment has become a payment method that cannot be ignored. As a developer, bill inquiry is an essential part when using WeChat Pay. This article will introduce how to use PHP language to query WeChat payment statements.

  1. Get WeChat payment account information

Before using WeChat payment, you first need to configure WeChat payment account information. After registering an account in the WeChat Pay Developer Center (https://pay.weixin.qq.com/) and completing relevant certifications, you can obtain WeChat Pay's APPID, merchant ID, merchant key and other information.

  1. Get Statement

After WeChat payment is completed, the system will generate the corresponding transaction record and upload the transaction record to the WeChat payment server. We can get the statement download link by calling the API provided by WeChat Pay.

The specific API is: https://api.mch.weixin.qq.com/pay/downloadbill

The API needs to pass the following parameters:

##appid is string(32)wxd678efh567hg6787The public account ID assigned by WeChatmch_id is string(32)1230000109The merchant number assigned by WeChat paymentnonce_str is string(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VSrandom string sign isstring(32)C380BEC2BFD727A4B6845133519F3AD6signature
Parameter name Required Type Example value Description
where, signature The generation needs to refer to the signature rules of WeChat Pay. For specific implementation methods, please refer to the official documents provided by WeChat Pay.

    Download statement
Through the statement download link obtained in the previous step, we can use PHP's curl library to download the statement. The specific code implementation is as follows:

$url = 'https://api.mch.weixin.qq.com/pay/downloadbill';
$params = array(
  'appid' => 'xxx',
  'mch_id' => 'xxx',
  'nonce_str' => 'xxx',
  'sign' => 'xxx',
  'bill_date' => 'xxx', // 对账单日期
  'bill_type' => 'ALL', // ALL-返回当日所有订单信息,SUCCESS-返回当日成功支付的订单,REFUND-返回当日退款订单,REVOKED-已撤销或已退款的订单
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
$response = curl_exec($ch);
curl_close($ch);

    Parse the statement
The downloaded statement is a csv file and needs to be parsed by PHP for further processing. We can use the fgetcsv function to read the data of each row and then parse the data.

The specific code implementation is as follows:

$lines = explode("
", $response);
$header = explode(",", $lines[0]); // 第一行为表头信息
$data = array();
for($i = 1; $i < count($lines)-2; $i++) { // 最后两行为统计信息,不需要处理
  $line = explode(",", $lines[$i]);
  $row = array();
  foreach ($header as $key => $value) {
    $row[$value] = $line[$key];
  }
  $data[] = $row;
}

    Processing data
The statement returns the original data, which requires certain processing to get reconciliation. result. We can group the data according to merchant order numbers, and then filter the data according to order number, transaction type, transaction status and other conditions. Finally, the reconciliation results can be output to the HTML page.

The specific code implementation is as follows:

$grouped_data = array();
foreach ($data as $row) {
  $grouped_data[$row['商户订单号']][] = $row;
}

$result = array();
foreach ($grouped_data as $order_no => $order_lines) {
  $success_lines = array_filter($order_lines, function($line) {
     return $line['交易状态'] == 'SUCCESS';
  });
  if (count($success_lines) == 0) {
    $result[] = array(
      'order_no' => $order_no,
      'reconciliation_status' => 'fail',
      'transaction_type' => $order_lines[0]['交易类型'],
      'transaction_status' => $order_lines[0]['交易状态'],
      'total_amount' => $order_lines[0]['应结订单金额'],
      'refund_amount' => $order_lines[0]['已退款金额'],
      'fee' => $order_lines[0]['手续费'],
    );
  } else {
    $success_line = $success_lines[0];
    $total_amount = array_sum(array_column($order_lines, '应结订单金额'));
    $refund_amount = array_sum(array_column($order_lines, '已退款金额'));
    $fee = array_sum(array_column($order_lines, '手续费'));
    $result[] = array(
      'order_no' => $order_no,
      'reconciliation_status' => 'success',
      'transaction_type' => $success_line['交易类型'],
      'transaction_status' => $success_line['交易状态'],
      'total_amount' => $total_amount,
      'refund_amount' => $refund_amount,
      'fee' => $fee,
    );
  }
}

// 输出结果到HTML页面上
echo "<table>";
echo "<tr><td>订单号</td><td>对账状态</td><td>交易类型</td><td>交易状态</td><td>总金额</td><td>退款金额</td><td>手续费</td></tr>"
foreach ($result as $row) {
  echo "<tr>";
  echo "<td>{$row['order_no']}</td>";
  echo "<td>{$row['reconciliation_status']}</td>";
  echo "<td>{$row['transaction_type']}</td>";
  echo "<td>{$row['transaction_status']}</td>";
  echo "<td>{$row['total_amount']}</td>";
  echo "<td>{$row['refund_amount']}</td>";
  echo "<td>{$row['fee']}</td>";
  echo "</tr>";
}
echo "</table>";

At this point, the process of using PHP to implement WeChat payment statement query is over. I hope this article can help developer friends who are using WeChat Pay.

The above is the detailed content of How to use PHP to implement WeChat payment statement inquiry. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn