微信小程序已经成为了很多商户的重要营销渠道和交易场所。而其中,微信小程序支付更是众多商户的一项核心需求。在小程序开发中,实现微信小程序支付的功能是非常必要的,本文将从原理角度为您详细介绍php微信小程序支付开发。
一、微信支付相关的术语
在进行微信小程序支付开发前,我们需要先了解微信支付相关的一些术语,包括以下几个:
1、APPID:小程序的唯一标识符,由微信开放平台统一分配。
2、MCHID:微信支付分配给商户的唯一标识,由微信支付统一分配。
3、KEY:商户密钥,用于签名和验证数据。
4、JSAPI:通过微信公众号或小程序进行支付的方式。
5、支付证书:微信支付时,需要进行证书验证,确保支付流程安全。
二、微信小程序支付的开发流程
微信小程序支付的流程包括如下几步:
1、用户下单:从小程序向自己服务器请求支付,服务器返回生成订单信息和支付信息(包括签名等)。
2、调用微信支付API:小程序将服务器返回的支付信息提交给微信支付API,获取支付凭证。
3、向小程序端传递支付凭证:小程序将支付凭证传给自己服务器,服务器接收到支付凭证后,验证证书。如果验证通过,则标识支付成功。
4、返回支付结果:服务器返回支付结果,小程序显示支付成功或支付失败。
三、php微信小程序支付的具体开发步骤
1、注册微信支付
在微信支付开发前,需要在微信开放平台注册并开通微信支付。
2、配置支付信息
在微信支付开发中,需要将微信支付的相关信息(APPID、MCHID、KEY等)配置到代码中。
3、生成小程序预支付订单
在小程序中,用户购买商品后,将订单信息提交给服务器,服务器生成小程序预支付订单号。同时,服务器生成随机字符串和时间戳,并将这些信息进行签名,生成XML格式数据。
4、调用微信支付API
将生成的XML格式数据传递给微信支付API,调用微信支付统一下单API,获取支付凭证。
5、将支付凭证传回小程序端
将小程序支付的支付凭证传回小程序端,供小程序调用。
6、验证证书
在服务端,验证证书的正确性,防止支付过程中出现问题。
7、返回支付结果
根据微信支付的返回结果,返回支付成功或支付失败。
四、php微信小程序支付相关代码示例
由以上步骤可知,php微信小程序支付开发的难点在于签名和验签的过程。以微信小程序支付为例,代码示例如下:
1、生成小程序预支付订单
```php
//生成预支付订单号
function createOrder(){
$postData["nonce_str"]=getRandomStr(32);//随机生成32位字符串
$postData["body"]="商品描述";//商品描述
$postData["out_trade_no"]="自己的订单号";//商户订单号
$postData["total_fee"]=1;//商品总金额,单位为分
$postData["spbill_create_ip"]=$_SERVER['REMOTE_ADDR'];//用户ip地址
$postData["notify_url"]="https://商户支付回调地址";//异步通知地址,支付成功后微信服务器会将支付结果通知到这个地址
$postData["trade_type"]="JSAPI";//小程序支付方式为JSAPI
$postData["openid"]="用户openid";//用户openid
//计算签名,使用MD5加密生成签名
$postData["sign"]=$this->wxPaySign($postData);
$url="https://api.mch.weixin.qq.com/pay/unifiedorder";
$result=curl_request($url,xml_encode($postData));
//解析结果
$result_array=xml_decode($result);
//返回订单信息和预支付ID
return [$result_array,$result_array["prepay_id"]];
}
//生成随机字符串函数
function getRandomStr( $length = 32 ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
```
2、验签及验证证书
```php
//验签函数
public function payCallback(){
header("Content-Type:application/xml; charset=UTF-8");
$result=file_get_contents("php://input");//读取原始POST数据
$result_array=xml_decode($result);
if($result_array["return_code"]=="SUCCESS"){
if($this->checkPayResult($result_array)){
echo "
//支付成功,进行订单后续处理
}
}
}
//签名验证函数
public function checkPayResult($result_array){
$md5_str=$this->wxPaySign($result_array);
if($md5_str==$result_array["sign"]){
//验证通过,返回true,用以确定用户付款成功
return true;
}else{
return false;
}
}
//证书验证函数
public function verifySign($prepay_id){
$url=$this->url."/".$prepay_id;
$header=array();
$header[]="Content-Type: text/xml";//定义content-type为xml
$header[]="Accept: text/xml";//定义accept为xml
$header[]="User-Agent: curl/7.36.0";//定义user-agent为curl
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1);//环境中有一部分机器部署的是tls 1.0或tls 1.1版本,需要建立TLSv1版本的SSL连接
curl_setopt($ch,CURLOPT_SSLCERT,"payment/cert/apiclient_cert.pem");//调用证书
curl_setopt($ch,CURLOPT_SSLKEY,"payment/cert/apiclient_key.pem");//调用证书
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
curl_setopt($ch,CURLOPT_POSTFIELDS, $xml_data);
$dataxml=curl_exec($ch);
if(curl_errno($ch)){
echo 'Curl error: '.curl_error($ch);
}
curl_close($ch);
return $dataxml;
}
```
以上是php微信小程序支付开发的相关原理和详细介绍,希望能对您在开发微信小程序支付时有所帮助。