微信公众号是一个强大的平台,让企业和个人可以通过开发自己的应用程序与用户进行互动。而微信支付则让用户可以通过微信支付功能直接在微信中完成支付。PHP是一种流行的服务器端脚本语言,可以与微信公众号和微信支付进行集成。本文将介绍如何使用PHP开发微信公众号中的微信支付功能,并通过举例说明其应用。
1. 创建微信支付订单
在微信公众号中实现微信支付的第一步是创建支付订单。首先,我们需要获取用户的openid,这可以通过微信授权登录获取。然后,我们可以使用PHP的cURL函数向微信支付接口发送请求,创建支付订单。下面是一个示例代码:
//by www.qzphp.cn <?php $openid = $_SESSION['openid']; // 获取用户的 openid$total_fee = 100; // 支付金额,单位为分// 构建请求参数 $data = array( 'appid' => 'your_appid', 'mch_id' => 'your_mch_id', 'nonce_str' => uniqid(), 'body' => '商品描述', 'out_trade_no' => uniqid(), 'total_fee' => $total_fee, 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], 'notify_url' => 'your_notify_url', 'trade_type' => 'JSAPI', 'openid' => $openid); // 生成签名 $data['sign'] = sign($data, 'your_api_key'); // 将请求参数转换为 XML格式$xml = arrayToXml($data); // 发送请求并解析返回结果 $response = sendRequest('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml); $result = xmlToArray($response); if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { // 创建支付订单成功 $prepay_id = $result['prepay_id']; // 根据 prepay_id生成支付参数供前端调用 $jsapi_params = getJsapiParams($prepay_id, 'your_appid', 'your_api_key'); // 将支付参数返回给前端 echo json_encode($jsapi_params); } else { // 创建支付订单失败 echo '创建支付订单失败'; } // 签名函数 function sign($data, $api_key) { ksort($data); $str = ''; foreach($data as $k=>$v) { if($k != 'sign' && $v != '') { $str .= $k . '=' . $v . '&'; } } $str .= 'key=' . $api_key; return strtoupper(md5($str)); } // 其他辅助函数... ?></ pre>2. 前端页面调用微信支付
创建支付订单成功后,我们需要将返回的支付参数传递给前端页面,以便用户可以通过微信支付完成支付。以下是一个简单的前端页面示例:
//by www.qzphp.cn <script src="//res.wx.qq.com/open/js/jweixin-1.6.0.js"></script><script> wx.config({ debug: false, appId: 'your_appid', timestamp: <?php echo time(); ?>, nonceStr: '<?php echo uniqid(); ?>', signature: '<?php echo $signature; ?>', jsApiList: ['chooseWXPay'] } ); wx.ready(function() { document.getElementById('pay-button').onclick = function() { wx.chooseWXPay({ timestamp: <?php echo $jsapi_params['timeStamp']; ?>, nonceStr: '<?php echo $jsapi_params['nonceStr']; ?>', package: '<?php echo $jsapi_params['package']; ?>', signType: '<?php echo $jsapi_params['signType']; ?>', paySign: '<?php echo $jsapi_params['paySign']; ?>', success: function(res) { // 支付成功后的回调函数 } } ); } ; } ); </ script><button id="pay-button">立即支付</button>3. 处理微信支付结果通知
当用户成功支付后,微信支付会向我们提供的通知URL发送支付结果通知。我们需要通过PHP编写一个接收和处理支付结果通知的脚本,以下是一个处理支付结果通知的示例代码:
//by www.qzphp.cn <?php $xml = file_get_contents('php://input'); $data = xmlToArray($xml); // 解析 XML数据// 验证签名 $sign = $data['sign']; unset($data['sign']); $api_key = 'your_api_key'; if($sign == sign($data, $api_key)) { // 校验通过,处理支付结果 if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS') { // 支付成功,更新订单状态 } else { // 支付失败,记录错误日志 } } else { // 校验失败,记录错误日志 } // 签名函数 function sign($data, $api_key) { ksort($data); $str = ''; foreach($data as $k=>$v) { if($k != 'sign' && $v != '') { $str .= $k . '=' . $v . '&'; } } $str .= 'key=' . $api_key; return strtoupper(md5($str)); } // 其他辅助函数... ?></ pre>通过以上步骤,我们可以在微信公众号中实现微信支付功能。无论是在线购物、捐赠还是预订服务,都可以通过微信支付方便快捷地完成支付交易。