网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入支付宝支付的带来些许帮助和借鉴意义。
环境依赖
PHP5.0以上,且需要开启CURL服务、SSL服务。
注意事项
1.文件开头的配置信息必须完善 2.商户私钥需填写对应签名算法类型的私钥,如何生成密钥参考: 2.1 生成RSA密钥 2.2 创建应用
class AlipayService
{
protected $appId;
protected $returnUrl;
protected $notifyUrl;
protected $charset;
//私钥值
protected $rsaPrivateKey;
public function __construct($appid,$saPrivateKey)
{
$this->appId = $appid;
$this->returnUrl = $returnUrl;
$this->notifyUrl = $notifyUrl;
$this->charset = 'utf8';
$this->rsaPrivateKey=$saPrivateKey;
}
/**
- 发起订单
- @param float $totalFee 收款总费用 单位元
- @param string $outTradeNo 唯一的订单号
- @param string $orderName 订单名称
- @param string $notifyUrl 支付结果通知url 不要有问号
- @param string $timestamp 订单发起时间
- @return array
*/
public function doPay($totalFee,$notifyUrl)
{
//请求参数
$requestConfigs = array(
'out_trade_no'=>$outTradeNo,'product_code'=>'FAST_INSTANT_TRADE_PAY','total_amount'=>$totalFee,//单位 元
'subject'=>$orderName,//订单标题
);
$commonConfigs = array(
//公共参数
'app_id' => $this->appId,'method' => 'alipay.trade.page.pay',//接口名称
'format' => 'JSON','return_url' => $returnUrl,'charset'=>$this->charset,'sign_type'=>'RSA2','timestamp'=>date('Y-m-d H:i:s'),'version'=>'1.0','notify_url' => $notifyUrl,'biz_content'=>json_encode($requestConfigs),);
$commonConfigs["sign"] = $this->generateSign($commonConfigs,$commonConfigs['sign_type']);
return $this->buildRequestForm($commonConfigs);
}
/**
- 建立请求,以表单HTML形式构造(默认)
- @param $para_temp 请求参数数组
- @return 提交表单HTML文本
*/
protected function buildRequestForm($para_temp) {
$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=".$this->charset."' method='POST'>";
while (list ($key,$val) = each ($para_temp)) {
if (false === $this->checkEmpty($val)) {
$val = str_replace("'","'",$val);
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
}
}
//submit按钮控件请不要含有name<a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>
$sHtml = $sHtml."<input type='submit' value='ok' style='display:none;''></form>";
$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
return $sHtml;
}
public function generateSign($params,$signType = "RSA") {
return $this->sign($this->getSignContent($params),$signType);
}
protected function sign($data,$signType = "RSA") {
$priKey=$this->rsaPrivateKey;
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey,64,"\n",true) .
"\n-----END RSA PRIVATE KEY-----";
($res) or die('您使用的私钥格式<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>,请检查RSA私钥配置');
if ("RSA2" == $signType) {
openssl_sign($data,$sign,$res,version_compare(<a href="/tag/PHP/" target="_blank" class="keywords">PHP</a>_VERSION,'5.4.0','<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持
} else {
openssl_sign($data,$res);
}
$sign = base64_encode($sign);
return $sign;
}
/**
- 校验$value是否非空
- if not set,return true;
- if is null,return true;
**/
protected function checkEmpty($value) {
if (!isset($value))
return true;
if ($value === null)
return true;
if (trim($value) === "")
return true;
return false;
}
public function getSignContent($params) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v,1)) {
// 转换成目标字符集
$v = $this->characet($v,$this->charset);
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
unset ($k,$v);
return $stringToBeSigned;
}
/**
- 转换字符集编码
- @param $data
- @param $targetCharset
- @return string
*/
function characet($data,$targetCharset) {
if (!empty($data)) {
$fileType = $this->charset;
if (strcasecmp($fileType,$targetCharset) != 0) {
$data = mb_convert_encoding($data,$targetCharset,$fileType);
//$data = iconv($fileType,$targetCharset.'//IGNORE',$data);
}
}
return $data;
}
}