小程序的支付功能对于电商、餐饮、门票等领域的线上业务来说是至关重要的,能够极大地提升小程序的用户体验与用户留存。而开发小程序支付接口有很多种方式,例如使用微信支付、支付宝支付等。本文将针对使用php进行小程序支付接口开发的方法进行详细介绍。
1. 前置条件
要想进行小程序支付接口的开发,需要满足以下前置条件:
- 所需的服务器环境:Apache、MySQL、PHP
- 微信支付的商户号和Api密钥
- 小程序支付的调用参数
2. 支付流程原理
小程序支付接口的流程可以分为以下步骤:
- 用户在小程序中选择商品并提交订单,小程序向服务器发送支付请求
- 服务器接收支付请求,调用微信支付的统一下单接口获取预支付订单信息
- 服务器将预支付订单信息返回给小程序客户端
- 小程序客户端接收到预支付订单信息后,调用微信支付JsApi支付接口拉取微信客户端支付界面,并使用微信支付的Api密钥加密预支付订单信息进行支付
- 用户在微信客户端支付成功后,微信服务端向小程序和服务器发送异步通知,表示订单已经支付完成
- 服务器接收支付结果通知,更新订单状态,告知小程序支付成功,完成支付流程
3. 代码实现
下面将一步步介绍如何使用php进行小程序支付接口的开发。
1. 首先,需要在小程序中提交订单时向服务器发送支付请求,可以通过php的cURL库实现。
```php
$url = 'http://localhost/payment.php';
$data = array(
'productName' => 'iPhone XR', //商品名称
'amount' => '3999', //商品价格,单位:分
'orderNo' => date('YmdHis').mt_rand(1000, 9999), //订单号,32个字符内、可包含字母
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
curl_close($ch);
echo $res;
?>
```
2. 接着,支付接口需要向微信支付的服务器发起统一下单请求,获取预支付订单的信息。具体实现方法可以参考微信支付开发文档。
```php
$appid = 'your appid';
$mch_id = 'your mch_id';
$nonce_str = md5(mt_rand());
$trade_type = 'JSAPI'; //小程序支付请求方式,固定值:JSAPI
$openid = 'your openid';
$productName = $_POST['productName']; //获取商品名称
$amount = $_POST['amount']; //获取商品价格
$orderNo = $_POST['orderNo']; //获取订单号
$api_key = 'your api key';
$data = array(
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => $nonce_str,
'body' => $productName,
'out_trade_no' => $orderNo,
'total_fee' => $amount,
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
'notify_url' => 'http://localhost/notify.php', //微信支付结果的异步通知地址
'trade_type' => $trade_type,
'openid' => $openid,
);
ksort($data);
$signStr = urldecode(http_build_query($data))."&key=".$api_key;
$sign = strtoupper(md5($signStr));
$data['sign'] = $sign;
$xml = "
foreach ($data as $key => $value) {
$xml .= "<$key>$key>";
}
$xml .= "";
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$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);
$res = curl_exec($ch);
curl_close($ch);
$arr = xml2Array($res);
if ($arr['return_code'] == 'SUCCESS' && $arr['result_code'] == 'SUCCESS') {
$nonceStr = md5(mt_rand());
$timeStamp = time();
$package = "prepay_id=".$arr['prepay_id'];
$signType = "MD5";
$string = "appId=$appid&nonceStr=$nonceStr&package=$package&signType=$signType&timeStamp=$timeStamp&key=$api_key";
$paySign = strtoupper(md5($string));
$result = array(
'appId' => $appid,
'timeStamp' => $timeStamp,
'nonceStr' => $nonceStr,
'package' => $package,
'signType' => $signType,
'paySign' => $paySign,
);
echo json_encode($result);
} else {
echo "fail";
}
function xml2Array($xml)
{
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
?>
```
3. 小程序客户端通过调用微信支付的JsApi支付接口,根据返回的预支付订单信息拉起微信客户端的支付界面,具体实现方法可以参考微信支付开发文档。
```javascript
//调用微信小程序支付的Api
wx.requestPayment({
'timeStamp': res.timeStamp.toString(),
'nonceStr': res.nonceStr,
'package': res.package,
'signType': 'MD5',
'paySign': res.paySign,
'success': function(res) {
//支付成功后的处理
wx.navigateTo({
url: './success',
})
},
'fail': function(res) {
//支付失败后的处理
wx.navigateBack({
delta: 1,
})
}
})
```
4. 微信支付完成后,微信服务端会异步向服务器发送支付结果通知,服务器需要处理这些通知,更新订单状态,以便通知小程序支付成功或失败。具体实现方法可以参考微信支付开发文档。
```php
$xml = file_get_contents('php://input');
$arr = xml2Array($xml);
if ($arr['return_code'] == 'SUCCESS' && $arr['result_code'] == 'SUCCESS') {
//更新订单状态,通知小程序支付成功
} else {
//通知小程序支付失败
}
function xml2Array($xml)
{
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
?>
```
4. 总结
本文详细介绍了如何使用php进行小程序支付接口的开发,从小程序端向服务器发送支付请求,到服务器调用微信支付的统一下单接口获取预支付订单信息,再到小程序客户端拉起微信客户端的支付界面,最后服务器接收支付结果通知,更新订单状态,通知小程序支付成功或失败,每一步都进行了详细的代码实现。对于初学者来说能够通过本文的讲解快速了解整个小程序支付接口的开发流程。