# 微信支付-公众号支付 [TOC] 微信公众号支付是专为微信公众号设计的支付方式,用户可以在微信内完成支付,适用于公众号内的商品购买、服务付费等场景。 ## 功能特性 - **微信内支付**:用户在微信内完成支付 - **安全可靠**:使用微信支付安全体系 - **简单易用**:只需调用统一下单接口 - **实时到账**:支付成功后资金实时到账 ## 支付流程 ### 1. 统一下单 调用统一下单接口创建支付订单,获取prepay_id。 ### 2. 调起支付 使用prepay_id调起微信支付。 ### 3. 支付结果 处理支付成功或失败的结果。 ## 基础配置 ### 配置参数 ```php <?php $config = [ // 基础配置 'appid' => 'wx60a43dd8161666d4', // 公众号AppID 'appsecret' => 'your_wechat_appsecret', // 公众号AppSecret 'mch_id' => '1235704602', // 商户号 'mch_key' => 'your_merchant_key', // 商户密钥 // 回调配置 'notify_url' => 'https://your-domain.com/notify.php', // 支付结果通知地址 // 其他配置 'cache_path' => '/path/to/cache', // 缓存目录 'debug' => false, // 是否开启调试模式 ]; ``` ## 基础用法 ### 创建支付订单 ```php <?php try { // 创建支付实例 $wechat = \WePay\Order::instance($config); // 支付参数 $options = [ 'body' => '测试商品', 'out_trade_no' => 'ORDER_' . time(), 'total_fee' => '100', // 单位:分 'openid' => 'o38gpszoJoC9oJYz3UHHf6bEp0Lo', 'trade_type' => 'JSAPI', 'notify_url' => 'https://your-domain.com/notify.php', 'spbill_create_ip' => '127.0.0.1', ]; // 创建订单 $result = $wechat->create($options); if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') { // 订单创建成功,获取prepay_id $prepayId = $result['prepay_id']; // 生成JSAPI支付参数 $jsApiParams = $wechat->jsapiParams($prepayId); // 将参数传给前端发起支付 echo json_encode($jsApiParams); } else { // 订单创建失败 echo "订单创建失败:" . $result['return_msg']; } } catch (Exception $e) { echo "错误:" . $e->getMessage(); } ``` #### 创建支付订单接口说明 **接口地址:** `POST https://api.mch.weixin.qq.com/pay/unifiedorder` **功能描述:** - 创建微信公众号支付订单 - 获取预支付交易会话标识prepay_id - 用于公众号内商品购买、服务付费等场景 **请求参数:** - `appid` (string): 公众号AppID,必填 - `mch_id` (string): 商户号,必填 - `nonce_str` (string): 随机字符串,必填,≤32字符 - `body` (string): 商品描述,必填,≤128字符 - `out_trade_no` (string): 商户订单号,必填,≤32字符,唯一 - `total_fee` (int): 订单总金额,必填,单位分 - `spbill_create_ip` (string): 用户端IP,必填 - `notify_url` (string): 通知地址,必填 - `trade_type` (string): 交易类型,必填,JSAPI - `openid` (string): 用户openid,必填 - `sign` (string): 签名,必填 **返回参数:** - `return_code` (string): 通信标识,SUCCESS/FAIL - `return_msg` (string): 返回信息 - `result_code` (string): 业务结果,SUCCESS/FAIL - `prepay_id` (string): 预支付交易会话标识 - `trade_type` (string): 交易类型 - `code_url` (string): 二维码链接 **业务限制:** - 订单号必须唯一 - 金额不能为0 - 需要用户授权获取openid - 支付金额有上限限制 **注意事项:** - 需要先获取用户openid - 支付参数需要正确签名 - 建议设置合理的超时时间 - 需要处理支付结果通知 #### 创建支付订单案例 ```php <?php // 微信公众号支付案例 include "WeChatDeveloper/include.php"; $config = [ 'appid' => 'wx60a43dd8161666d4', 'appsecret' => 'your_wechat_appsecret', 'mch_id' => '1235704602', 'mch_key' => 'your_merchant_key', 'notify_url' => 'https://your-domain.com/notify.php', 'cache_path' => '/path/to/cache', 'debug' => false, ]; try { $wechat = \WePay\Order::instance($config); echo "=== 微信公众号支付 ===\n"; // 支付参数 $options = [ 'body' => '测试商品', 'out_trade_no' => 'ORDER_' . time(), 'total_fee' => '100', 'openid' => 'o38gpszoJoC9oJYz3UHHf6bEp0Lo', 'trade_type' => 'JSAPI', 'notify_url' => 'https://your-domain.com/notify.php', 'spbill_create_ip' => '127.0.0.1', ]; // 创建订单 $result = $wechat->create($options); echo "响应结果: " . json_encode($result, JSON_PRETTY_PRINT) . "\n"; if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') { echo "订单创建成功!\n"; echo "预支付ID: " . $result['prepay_id'] . "\n"; // 生成JSAPI支付参数 $jsApiParams = $wechat->jsapiParams($result['prepay_id']); echo "JSAPI支付参数: " . json_encode($jsApiParams, JSON_PRETTY_PRINT) . "\n"; } else { echo "订单创建失败: " . $result['return_msg'] . "\n"; } } catch (Exception $e) { echo "错误: " . $e->getMessage() . "\n"; } ``` ## 前端支付调用 ### JavaScript调用示例 ```javascript // 调用微信支付 function callWeChatPay(jsApiParams) { WeixinJSBridge.invoke('getBrandWCPayRequest', jsApiParams, function(res) { if (res.err_msg == "get_brand_wcpay_request:ok") { // 支付成功 alert("支付成功!"); // 跳转到成功页面 window.location.href = "/success.php"; } else if (res.err_msg == "get_brand_wcpay_request:cancel") { // 用户取消支付 alert("支付已取消"); } else { // 支付失败 alert("支付失败:" + res.err_msg); } }); } // 页面加载完成后调用 document.addEventListener('WeixinJSBridgeReady', function() { // 获取支付参数 fetch('/create_order.php') .then(response => response.json()) .then(data => { if (data.success) { callWeChatPay(data.jsApiParams); } else { alert("创建订单失败:" + data.message); } }); }); ``` ## 支付结果处理 ### 异步通知处理 ```php <?php // notify.php - 支付结果通知处理 $config = [ 'appid' => 'wx60a43dd8161666d4', 'appsecret' => 'your_wechat_appsecret', 'mch_id' => '1235704602', 'mch_key' => 'your_merchant_key', 'cache_path' => '/path/to/cache', ]; try { $wechat = \WePay\Order::instance($config); // 接收支付通知 $data = $wechat->getNotify(); if ($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS') { // 支付成功,处理业务逻辑 $outTradeNo = $data['out_trade_no']; $transactionId = $data['transaction_id']; $totalFee = $data['total_fee']; // 更新订单状态 // updateOrderStatus($outTradeNo, 'paid'); // 返回成功响应 echo $wechat->getNotifySuccessReply(); } else { // 支付失败 echo $wechat->getNotifySuccessReply(); } } catch (Exception $e) { echo '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[ERROR]]></return_msg></xml>'; } ``` ## 相关文档 - [统一下单](微信支付-统一下单.md) - 创建支付订单 - [查询订单](微信支付-查询订单.md) - 查询订单状态 - [关闭订单](微信支付-关闭订单.md) - 关闭未支付订单 - [申请退款](微信支付-申请退款.md) - 申请退款 - [查询退款](微信支付-查询退款.md) - 查询退款状态 - [支付通知](微信支付-支付通知.md) - 处理支付结果通知