让我来为您讲解如何实现PHP实现微信原生支付(扫码支付)。
1. 注册微信开发者账号
首先需要去微信公众平台注册开发者账号,并完成账号认证等操作,获取到相应的AppID、AppSecret等信息。
2. 配置商户信息
在微信商户平台中开通账户,并进行相关的商户信息配置。在商户平台中会获取到一些必要的信息,如商户号(mch_id)、密钥(key)等。
3. 下载微信支付API
去微信支付开发者文档下载官方提供的PHP支付API。
4. 实现支付功能
4.1 统一下单接口
首先在自己的网站中,实现调用微信支付的统一下单接口的功能。
具体实现过程参见示例代码:
<?php
require_once "WxPayApi.php";
// 统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody("商品描述"); // 商品描述
$input->SetOut_trade_no("商户订单号"); // 商户订单号
$input->SetTotal_fee("订单金额"); // 订单金额
$input->SetNotify_url("异步通知地址"); // 异步通知地址
$input->SetTrade_type("NATIVE"); // 交易类型为原生扫码支付
$input->SetProduct_id("商品ID"); // 商品ID
$result = WxPayApi::unifiedOrder($input);
// 获取二维码内容
if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') {
$code_url = $result['code_url'];
// 输出二维码
echo '<img src="https://api.qrserver.com/v1/create-qr-code/?data=' . urlencode($code_url) . '"/>';
} else {
echo '统一下单失败';
}
4.2 支付结果通知接口
还需要实现微信支付结果异步通知接口,处理微信支付系统发来的支付成功通知,并进行相应的业务逻辑处理,如更新订单状态等。
具体实现过程参见示例代码:
<?php
require_once "WxPayNotify.php";
require_once "WxPayApi.php";
class PayNotifyCallBack extends WxPayNotify {
// 重写回调处理函数,详见微信支付API文档
public function NotifyProcess($data, &$msg) {
if ($data['result_code'] == 'SUCCESS') {
// 支付成功,更新订单状态等业务逻辑处理
//...
}
return true;
}
}
// 接收并处理来自微信支付系统的支付成功通知
$notify = new PayNotifyCallBack();
$notify->Handle();
到此,就实现了基于PHP的微信原生支付(扫码支付)功能。
5. 附:示例代码
示例代码可以在官方微信支付API的PHP版下载包中找到,这里不再赘述。
再提供一下后台生成二维码的完整示例代码:
<?php
require_once('lib/WxPay.Api.php');
require_once('WxPay.NativePay.php');
require_once('WxPay.Notify.php');
function getParentUrl(){
$url = ($_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . "/";
$scriptName = $_SERVER['SCRIPT_NAME'];
$requestUri = $_SERVER['REQUEST_URI'];
$requestUri = substr($requestUri, strlen($scriptName));
$matchedUriParts = array();
preg_match_all('/(?<=\/)[^\/]*/', $requestUri, $matchedUriParts);
foreach ($matchedUriParts[0] as $part) {
if (!empty($part) && strpos($part, ':') === false) {
$url .= $part . '/';
}
}
return substr($url, 0, strlen($url) - 1);
}
$productname = $_POST["productname"];
$price = $_POST["price"];
$input = new WxPayUnifiedOrder();
$input->SetBody($productname);
$input->SetDetail("details");
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee($price * 100);//金额需要乘以100
$input->SetNotify_url(getParentUrl()."notify.php");
$input->SetTrade_type("NATIVE");
$input->SetProduct_id("123456789");
$notify = new NativePay();
$result = $notify->GetPayUrl($input);
$url2 = $result["code_url"];
//exit("<script>alert('请用微信扫描二维码进行支付');history.back(-1);</script>");
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title><?= $productname ?>-支付</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type="text/css">
/*.paybox {width: 400px;}
.paybox img {max-width: 100%;}*/
body {margin: 0;padding: 0;background: #efefef;color: #333;}
</style>
</head>
<body>
<div style="text-align: center;height: 100vh;">
<img src="http://qr.liantu.com/api.php?text=<?= urlencode($url2) ?>" style="width: 50%;" />
<br/>
<p style="color: #999;">请使用微信扫一扫进行支付</p>
</div>
</body>
</html>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现微信原生支付(扫码支付)功能 - Python技术站