一、概述
近年来,随着微信小程序的崛起,越来越多的企业将小程序作为自身创新的重点发展方向。在小程序开发过程中,微信支付作为实现商业化的重要手段,自然成为了开发人员必须要掌握的技术之一。本文将介绍如何在TP5框架中开发微信小程序支付的详细步骤。
二、微信小程序支付原理
微信小程序支付是基于微信支付实现的。在微信小程序中,我们可以通过调用微信提供的JS API面向用户发起支付请求,并返回支付结果,从而完成订单的支付流程。
微信小程序支付的具体流程如下:
1. 用户在小程序中选择商品和支付方式后,将支付信息提交至小程序后台服务器。
2. 小程序后台服务器将支付申请发起至微信支付平台,获取到预支付ID,并返回给小程序前端。
3. 小程序前端根据预支付ID,调起微信提供的JS API面向用户发起支付请求。
4. 微信支付平台向小程序后台服务器发起支付确认请求,小程序后台服务器将用户支付状态返回给微信支付平台。
5. 微信支付平台将用户支付状态返回到小程序前端。
6. 小程序前端根据支付状态,调用相关接口,完成订单的支付流程。
三、如何在TP5框架中开发微信小程序支付
在TP5框架中,我们可以通过如下步骤实现微信小程序支付:
1. 创建小程序,开启微信支付功能
在微信公众平台上创建小程序,并开启微信支付功能,获取到AppID、商户号、商户密钥等信息。同时,在微信商户平台上设置商户回调地址。
2. 配置微信支付相关配置
在TP5框架中,我们可以在config.php文件中配置微信支付相关信息,如下:
```php
return [
'wx_pay_appid' => /*填写AppID*/,
'wx_pay_mchid' => /*填写商户号*/,
'wx_pay_key' => /*填写商户密钥*/,
'wx_pay_notify_url' => /*填写商户回调地址*/,
];
```
3. 创建小程序支付控制器
在控制器中实现小程序支付的具体逻辑,调用微信支付API实现预支付和支付确认操作,如下:
```php
namespace app\wxpay\controller;
use think\Controller;
use think\Request;
class Pay extends Controller
{
/**
* 微信支付
*/
public function wxPay(Request $request)
{
// 获取支付金额和订单号
$totalFee = $request->post('total_fee');
$outTradeNo = $request->post('out_trade_no');
// 构造预支付统一下单接口参数
$params = [
'appid' => config('wx_pay_appid'),
'mch_id' => config('wx_pay_mchid'),
'nonce_str' => uniqid(),
'body' => '商品描述',
'out_trade_no' => $outTradeNo,
'total_fee' => $totalFee,
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
'notify_url' => config('wx_pay_notify_url'),
'trade_type' => 'JSAPI',
'openid' => '用户openid'
];
// 生成签名
$params['sign'] = $this->createSign($params);
// 调用预支付接口,获取prepay_id
$prepayId = $this->getPrepayId($params);
// 构造支付参数,返回给小程序前端
$payParams = [
'appId' => config('wx_pay_appid'),
'timeStamp' => time().'',
'nonceStr' => uniqid(),
'package' => 'prepay_id='.$prepayId,
'signType' => 'MD5'
];
$payParams['paySign'] = $this->createSign($payParams);
return json(['code' => 1, 'msg' => '预支付成功', 'data' => $payParams]);
}
/**
* 创建签名
*/
private function createSign($params)
{
ksort($params);
$string = '';
foreach ($params as $key => $value) {
$string .= $key.'='.$value.'&';
}
$string .= 'key='.config('wx_pay_key');
return strtoupper(md5($string));
}
/**
* 获取prepay_id
*/
private function getPrepayId($params)
{
// 构造XML数据
$xml = '
foreach ($params as $key => $value) {
$xml .= "<$key>$key>".PHP_EOL;
}
$xml .= ''.PHP_EOL;
// 发起预支付接口请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$data = curl_exec($ch);
curl_close($ch);
// 解析预支付接口响应数据
$xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
return $xml->prepay_id;
}
/**
* 微信支付确认
*/
public function wxPayNotify()
{
// 解析支付确认通知数据
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
$data = json_decode(json_encode($xml), true);
// 验证签名
if ($data['sign'] != $this->createSign($data)) {
exit('FAIL');
}
// 关闭订单
// ...
// 返回支付确认结果
echo '
}
}
```
四、总结
微信小程序支付是小程序商业化的重要手段之一,本文对于在TP5框架中开发微信小程序支付进行了详细介绍,通过本文的学习,相信你已经掌握了微信小程序支付的基本原理和在TP5框架中的开发方式。在实际开发中,除了以上步骤,我们还需要结合自身项目的实际需求,进行具体的开发。