在移动端开发中,微信小程序是非常重要的一部分。其中,支付功能是必不可少的一项功能。本文将介绍如何用PHP实现微信小程序的支付功能。
1、注册小程序和开通微信支付功能
在使用微信支付功能之前,我们需要在微信公众平台注册小程序,并开通微信支付功能。
1.1 注册小程序
在微信公众平台上进行注册,按照要求填写相关信息,就可以成功注册小程序。
1.2 开通微信支付功能
在小程序注册成功后,进入小程序管理后台,在“设置-开发设置-支付配置”页面中,按照要求填写相关信息,就可以开通微信支付功能。
2、PHP实现小程序支付功能
在小程序管理后台开通微信支付功能后,我们需要在小程序前端代码中调用微信支付API,并将支付所需信息传递到PHP后台进行处理。
2.1 前端代码
前端代码中需要调用微信支付API,并将支付所需信息传递到PHP后台进行处理。代码如下:
// 调用微信支付API
wx.requestPayment({
timeStamp: '', //时间戳,必填
nonceStr: '', //随机字符串,必填
package: '', //统一下单接口返回的 prepay_id 参数值,必填
signType: 'MD5', //签名算法,非必填
paySign: '', //签名,必填
success: function(res) {
// 支付成功回调函数
},
fail: function(res) {
// 支付失败回调函数
}
});
2.2 后台代码
在后台代码中,我们需要进行以下操作:
1. 获取微信支付API所需的信息;
2. 统一下单,获取 prepay_id 参数值;
3. 根据 prepay_id 参数值生成签名,返回给前端。
统一下单API地址:https://api.mch.weixin.qq.com/pay/unifiedorder
获取微信支付API所需的信息如下:
// 应用ID
$appid = '';
// 商户号
$mch_id = '';
// 随机字符串
$nonce_str = '';
// 商品描述
$body = '';
// 商户订单号
$out_trade_no = '';
// 标价金额
$total_fee = ;
// 终端IP
$spbill_create_ip = '';
// 通知地址
$notify_url = '';
// 交易类型
$trade_type = '';
统一下单代码如下:
// 生成签名
function makeSign($params, $key) {
// 将参数按照字典序排序
ksort($params);
// 拼接参数和值
$string = '';
foreach ($params as $k => $v) {
if ($v != '' && $k != 'sign') {
$string .= $k . '=' . $v . '&';
}
}
// 拼接商户 key
$string .= 'key=' . $key;
// 生成签名
$sign = strtoupper(md5($string));
return $sign;
}
// 统一下单
function unifiedOrder($appid, $mch_id, $nonce_str, $body, $out_trade_no, $total_fee, $spbill_create_ip, $notify_url, $trade_type, $key) {
// 拼接参数
$params = array(
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => $nonce_str,
'body' => $body,
'out_trade_no' => $out_trade_no,
'total_fee' => $total_fee,
'spbill_create_ip' => $spbill_create_ip,
'notify_url' => $notify_url,
'trade_type' => $trade_type
);
// 生成签名
$sign = makeSign($params, $key);
// 拼接 XML 请求参数
$xml = '<xml>
<appid>' . $appid . '</appid>
<mch_id>' . $mch_id . '</mch_id>
<nonce_str>' . $nonce_str . '</nonce_str>
<body><![CDATA[' . $body . ']]></body>
<out_trade_no>' . $out_trade_no . '</out_trade_no>
<total_fee>' . $total_fee . '</total_fee>
<spbill_create_ip>' . $spbill_create_ip . '</spbill_create_ip>
<notify_url>' . $notify_url . '</notify_url>
<trade_type>' . $trade_type . '</trade_type>
<sign>' . $sign . '</sign>
</xml>'>
// 发送 HTTPS POST 请求
$result = httpRequest('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml);
// 解析 XML 响应参数
$xmlObj = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);
// 返回 prepay_id 参数值
return strval($xmlObj->prepay_id);
}
生成签名代码如下:
//生成签名
function getSign($params,$key) {
//将参数按照字典序排序
ksort($params);
//将参数拼接成字符串
$string = '';
foreach ($params as $k => $v) {
if ($v != '' && $k != 'sign') {
$string .= $k . '=' . $v . '&';
}
}
$string .= 'key=' . $key;
//MD5加密
$string = md5($string);
//将小写字母转成大写字母
$result = strtoupper($string);
return $result;
}
最后,我们将统一下单返回的 prepay_id 值,再加上商户 key、时间戳、随机字符串等参数,生成签名,并将所需信息返回给前端。代码如下:
// 支付
function payment() {
// 获取微信支付 API 所需信息
$appid = '';
$mch_id = '';
$nonce_str = '';
$body = ''; // 商品描述
$out_trade_no = ''; // 商户订单号
$total_fee = ''; // 标价金额,单位:分
$spbill_create_ip = ''; // 终端IP
$notify_url = ''; // 通知地址
$trade_type = ''; // 交易类型
// 统一下单,获取 prepay_id 参数值
$prepay_id = unifiedOrder($appid, $mch_id, $nonce_str, $body, $out_trade_no, $total_fee, $spbill_create_ip, $notify_url, $trade_type, $key);
// 生成签名
$params = array(
'appId' => $appid,
'timeStamp' => strval(time()),
'nonceStr' => $nonce_str,
'package' => 'prepay_id=' . $prepay_id,
'signType' => 'MD5'
);
$sign = getSign($params, $key);
// 将结果返回给前端
$result = array(
'timeStamp' => $params['timeStamp'],
'nonceStr' => $params['nonceStr'],
'package' => $params['package'],
'signType' => 'MD5',
'paySign' => $sign
);
return $result;
}
至此,用PHP实现微信小程序支付功能的方法就介绍完毕了。