php实现支付宝当面付(扫码支付)功能

2018-09-07 13:15

阅读:443

  网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入支付宝支付的带来些许帮助和借鉴意义。

  扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。

  运行以下php文件代码即可生成一张付款二维码图片,使用支付宝扫一扫即可付款。

  一个PHP文件搞定支付宝系列

  一个PHP文件搞定微信支付系列

  环境依赖

  PHP5.0以上,且需要开启CURL服务、SSL服务。

  注意事项

  1.文件开头的配置信息必须完善
2.商户私钥需填写对应签名算法类型的私钥,如何生成密钥参考:
2.1生成RSA密钥
2.2创建应用

  代码

   <?php header(Content-type:text/html; Charset=utf-8); $appid = xxxxx; //账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $notifyUrl = 付款成功后的异步回调地址 $outTradeNo = uniqid(); //你自己的商品订单号 $payAmount = 0.01; //付款金额,单位:元 $orderName = 支付测试; //订单标题 $signType = RSA2; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:和生成二维码 $url = 二维码内容:.$result[qr_code]; }else{ echo $result[msg]. : .$result[sub_msg]; } class AlipayService { protected $appId; protected $returnUrl; protected $notifyUrl; //私钥文件路径 protected $rsaPrivateKeyFilePath; //私钥值 protected $rsaPrivateKey; public function __construct($appid, $returnUrl, $notifyUrl,$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, $outTradeNo, $orderName, $returnUrl,$notifyUrl) { //请求参数 $requestConfigs = array( out_trade_no=>$outTradeNo, total_amount=>$totalFee, //单位 元 subject=>$orderName, //订单标题 ); $commonConfigs = array( //公共参数 app_id => $this->appId, method => alipay.trade.precreate, //接口名称 format => JSON, 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]); $result = $this->curlPost(您使用的私钥格式错误,请检查RSA私钥配置); if (RSA2 == $signType) { openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,5.4.0, <) ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持 } else { openssl_sign($data, $sign, $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, 0, 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; } public function curlPost($url = , $postData = , $options = array()) { if (is_array($postData)) { $postData = http_build_query($postData); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数 if (!empty($options)) { curl_setopt_array($ch, $options); } //https请求 不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } }

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


评论


亲,登录后才可以留言!