揭秘:PHP轻松驾驭微信公众号支付,一步到位源码实战攻略
引言
随着移动互联网的快速发展,微信公众号已经成为企业和服务提供商重要的营销渠道。而微信支付作为微信生态中的重要组成部分,为用户提供便捷的支付服务。本文将为您揭秘如何使用PHP轻松实现微信公众号支付,并提供一步到位的源码实战攻略。
准备工作
在开始之前,您需要完成以下准备工作:
- 注册微信公众号:登录微信公众平台,注册并获取AppID和AppSecret。
- 申请微信支付功能:在微信支付商户平台申请开通微信支付功能,获取商户ID、API密钥等。
- 安装PHP开发环境:安装PHP、MySQL等开发环境,并确保PHP支持cURL扩展。
微信支付概述
微信支付分为两种模式:原生支付和JSAPI支付。本文以JSAPI支付为例,介绍如何使用PHP实现。
JSAPI支付流程
- 统一下单:商户发送统一下单请求到微信支付。
- 微信服务器响应:微信支付服务器返回预支付交易会话标识。
- 调用微信JSAPI:商户使用返回的预支付交易会话标识调用微信JSAPI。
- 用户支付:用户在微信客户端完成支付。
- 支付结果通知:微信支付服务器将支付结果通知给商户。
PHP实现微信支付
以下是使用PHP实现微信支付的基本步骤:
1. 配置微信支付参数
// 微信支付配置参数 $wechatPayConfig = [ 'appid' => '你的AppID', 'mch_id' => '你的商户ID', 'api_key' => '你的API密钥', 'notify_url' => '你的服务器通知地址', ]; 2. 创建统一下单请求
// 创建统一下单请求 function unifiedOrder($wechatPayConfig, $orderInfo) { // 构建请求参数 $params = [ 'appid' => $wechatPayConfig['appid'], 'mch_id' => $wechatPayConfig['mch_id'], 'body' => $orderInfo['body'], 'out_trade_no' => $orderInfo['out_trade_no'], 'total_fee' => $orderInfo['total_fee'], 'spbill_create_ip' => get_client_ip(), 'notify_url' => $wechatPayConfig['notify_url'], 'trade_type' => 'JSAPI', ]; // 生成签名 $params['sign'] = generateSign($params, $wechatPayConfig['api_key']); // 发送请求 $xml = xmlEncode($params); $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $result = postXmlCurl($url, $xml); // 解析返回结果 return xmlDecode($result); } // 获取客户端IP地址 function get_client_ip() { $ip = getenv('HTTP_CLIENT_IP') ? getenv('HTTP_CLIENT_IP') : getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR'); return preg_match('/^(d+.)+$/', $ip) ? '127.0.0.1' : $ip; } // 生成签名 function generateSign($params, $apiKey) { ksort($params); $signStr = ''; foreach ($params as $key => $value) { if ($key != 'sign' && $value != '') { $signStr .= $key . '=' . $value . '&'; } } $signStr .= 'key=' . $apiKey; return md5($signStr); } // XML编码 function xmlEncode($data) { return xml_encode(json_encode($data), ENT_QUOTES, 'UTF-8'); } // XML解码 function xmlDecode($xml) { return json_decode(json_encode(simplexml_load_string($xml)), true); } // 发送POST请求 function postXmlCurl($url, $xml) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_HEADER, false); $result = curl_exec($ch); curl_close($ch); return $result; } 3. 调用微信JSAPI
// 调用微信JSAPI function callWechatJsApi($wechatPayConfig, $prepayId) { // 构建JSAPI参数 $jsApiParams = [ 'appId' => $wechatPayConfig['appid'], 'timeStamp' => time(), 'nonceStr' => generateNonceStr(), 'package' => 'prepay_id=' . $prepayId, 'signType' => 'MD5', 'paySign' => generateSign($jsApiParams, $wechatPayConfig['api_key']), ]; // 返回JSAPI参数 return $jsApiParams; } // 生成随机字符串 function generateNonceStr() { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i < 32; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } 4. 接收支付结果通知
// 接收支付结果通知 function notifyUrl($wechatPayConfig) { // 获取通知参数 $xml = file_get_contents('php://input'); $data = xmlDecode($xml); // 验证签名 if (checkSign($data, $wechatPayConfig['api_key'])) { // 处理支付结果 // ... } } // 验证签名 function checkSign($data, $apiKey) { if (isset($data['sign'])) { unset($data['sign']); } ksort($data); $signStr = ''; foreach ($data as $key => $value) { if ($key != 'sign' && $value != '') { $signStr .= $key . '=' . $value . '&'; } } $signStr .= 'key=' . $apiKey; return md5($signStr) == $data['sign']; } 总结
通过本文的介绍,您已经掌握了使用PHP实现微信公众号支付的基本方法。在实际应用中,您可以根据具体需求对代码进行调整和优化。希望本文能对您有所帮助。
支付宝扫一扫
微信扫一扫