>백엔드 개발 >PHP 튜토리얼 >PHP는 Alipay 대면결제(스캔코드 결제) 기능을 구현합니다.

PHP는 Alipay 대면결제(스캔코드 결제) 기능을 구현합니다.

不言
不言원래의
2018-05-31 16:38:097568검색

이 기사는 주로 Alipay 대면 결제 및 스캔 코드 결제 기능을 구현하는 PHP를 소개합니다. 관심 있는 친구는 이를 참조할 수 있습니다.

인터넷에 있는 많은 PHP Alipay 결제 액세스 튜토리얼은 매우 유용합니다. 복잡하고 많은 구성과 파일 소개가 필요합니다. 정리하여 단일 파일 버전을 제공했습니다. Alipay 결제에 액세스하려는 모든 사람에게 도움과 참고가 되기를 바랍니다.

스캔코드 결제란 사용자가 Alipay 지갑에서 '스캔' 기능을 열고 특정 계산원 장면에서 판매자가 표시하는 QR 코드를 스캔하여 결제하는 모드를 말합니다. 이 모델은 오프라인 오프라인 매장 결제, 대면 결제 및 기타 시나리오에 적합합니다.

다음 PHP 파일 코드를 실행하여 결제 QR 코드 이미지를 생성하고, Alipay를 사용하여 스캔하여 결제하세요.

한 PHP 파일은 Alipay 시리즈를 처리합니다

한 PHP 파일은 WeChat 결제 시리즈를 처리합니다

환경 의존성

PHP5.0 이상, CURL 서비스 및 SSL 서비스를 활성화해야 합니다.

Notes

1. 파일 시작 부분의 구성 정보가 완전해야 합니다
2. 판매자의 개인 키는 서명 알고리즘 유형에 해당하는 개인 키를 입력해야 합니다.
2.1 RSA 키 생성
2.2 애플리케이션 만들기

Code

<?php
header(&#39;Content-type:text/html; Charset=utf-8&#39;);
$appid = &#39;xxxxx&#39;; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID
$notifyUrl = &#39;http://www.xxx.com/alipay/notify.php&#39;;   //付款成功后的异步回调地址
$outTradeNo = uniqid();   //你自己的商品订单号
$payAmount = 0.01;     //付款金额,单位:元
$orderName = &#39;支付测试&#39;;  //订单标题
$signType = &#39;RSA2&#39;;    //签名算法类型,支持RSA2和RSA,推荐使用RSA2
//商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310
$saPrivateKey=&#39;MIIEpAIBAAKCAQEA1MV+OY6MvGfXPM0MkpjT+FdzGmPOvVmX2wF3gjwQpeHBEUP9jLXhVS32fZ1iXI1e7WUGQ5tvXn28P8190kpOn/c/G5t2CAksUvemvF7uJN/N3Z1HFMdt3omvCd14K05lgcFYz7Z4c+A7ZJF5bPCB6oshjjUmbCY3hibuWzX/1j8AgsoD9lLy1oFqxLj98k5ZrYIhk900gMQs/WJ3A1FC09Dln9fuhBUyjtPHaml+4w+sdkdzxPktxdFrMcI7M7rNEwg25XtST5Z49oFpE84AlXM7+oC9jYvIpTGE00WomsgtakN039ucT/59Bup6pLkO08Rv85UXbqzGTcYAhNHLfQIDAQABAoIBAQCbuPM58s+j8KgB8ty5yiqRPoeaj+O2h4Txn7A02/sfPQvNtCI0w3TpT5twsihULo+EVYTxJCitUn7df2sP5pyGzTEd5njLRtNu4Zvhj+Thjf8grERiu9b4oXI/WRzjLRxzi+uREi40OK+fWi0xgxDCdROY/eNiEdJfV8zpaqsUxG7VdwZIJQ/8d3Mi31OWv30kr9jfEd15DBInGJgSqR+qwrAB4pBSMcW8hL6PYlzoPi1ygceFjRrnbeMG40zt0OUPSexQIgAmFvGqxTl5xo3dFEziGHdfWYsBKZ2M8ubAe+R6LcndxI+o2Hw4TNcC1tDeNMtjw7+h9S5aef5A8uWBAoGBAPxCLWPhUHCYlIXUz0D1SoolZs9WK7Kz1YSWnzqrpegN+foS5/ji93YylGE+KL31TwbnGQLAwknwMX3qTzmkvTovmy8jevXBsCSEFm81q0wG/35e1SKkTXL66RqB2y0xFLdcF3f9s8ZiEclqkYwNSHh0nqzREfIxMMAsj+3n2vHdAoGBANftYkZYrbs4iI/ZcjmBYguYikNfNmrD+Ta6ckOGZqsHfwXJCAz1rF4/XCqVAc9nxuzJR/72qkn9z07uH6qSZCqlZDRkiiKaK2UVqFDB+0abMk/TGHXuMmdvMkyj2jEZxG2rkg0kmg4qYkkg/5tGG1On/2GeZNVPu8JpsFr1pDYhAoGBANr8pCTKC6fDfWP1C3qrtmrY7zhc6RB4d4pjq5UmP5+EypaiZQi2F/dfD1qfuIS3eURXyGmQZtoDDyPtDZvP/ImPnFs+pNbFryD0HfmrEKquhIvyzXoGQknnsgbV5iyEKCTJaII9FxzINAKzZei7+0a+jqUd1kN3Gogp50Sze2ltAoGARaM5Xpaa8RZ6dGocfI9Nn4/Ch5fdZPFvHkdjMoPV+LKiNKtw/Tz+KiclAlasDsfZT+RaY9AJe3NvuHTzoX807swIVR1Xr3EpLaCed+0XrN3AjB34dZAskU87WZw+cjdtMjFzGOoFBSyGJi+OP/WMOp6jo/YBbwoX88tCJROzsgECgYAT8pHHIyPt5Y/5pDb8EDvD3XNES1fBkfZffSoAodsrkeoKgrsKl+9M3rcGX+S9dscyoH0ur3BFTMHtIOOhC5qytt+BhMHIP5mAs4di4u/joQCWQbUyrUggVK5it+6BFgAT+jeB7zTAUtgGpTVFq3kLbV0NZ+XQyEHVlnoJnHYpQg==&#39;;
$aliPay = new AlipayService($appid,$returnUrl,$notifyUrl,$saPrivateKey);
$result = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl);
$result = $result[&#39;alipay_trade_precreate_response&#39;];
if($result[&#39;code&#39;] && $result[&#39;code&#39;]==&#39;10000&#39;){
  //生成二维码
  $url = &#39;http://pan.baidu.com/share/qrcode?w=300&h=300&url=&#39;.$result[&#39;qr_code&#39;];
  echo "<img src=&#39;{$url}&#39; style=&#39;width:300px;&#39;><br>";
  echo &#39;二维码内容:&#39;.$result[&#39;qr_code&#39;];
}else{
  echo $result[&#39;msg&#39;].&#39; : &#39;.$result[&#39;sub_msg&#39;];
}
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 = &#39;utf8&#39;;
    $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(
      &#39;out_trade_no&#39;=>$outTradeNo,
      &#39;total_amount&#39;=>$totalFee, //单位 元
      &#39;subject&#39;=>$orderName, //订单标题
    );
    $commonConfigs = array(
      //公共参数
      &#39;app_id&#39; => $this->appId,
      &#39;method&#39; => &#39;alipay.trade.precreate&#39;,       //接口名称
      &#39;format&#39; => &#39;JSON&#39;,
      &#39;charset&#39;=>$this->charset,
      &#39;sign_type&#39;=>&#39;RSA2&#39;,
      &#39;timestamp&#39;=>date(&#39;Y-m-d H:i:s&#39;),
      &#39;version&#39;=>&#39;1.0&#39;,
      &#39;notify_url&#39; => $notifyUrl,
      &#39;biz_content&#39;=>json_encode($requestConfigs),
    );
    $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs[&#39;sign_type&#39;]);
    $result = $this->curlPost(&#39;https://openapi.alipay.com/gateway.do&#39;,$commonConfigs);
    return json_decode($result,true);
  }
  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(&#39;您使用的私钥格式错误,请检查RSA私钥配置&#39;);
    if ("RSA2" == $signType) {
      openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,&#39;5.4.0&#39;, &#39;<&#39;) ? 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.&#39;//IGNORE&#39;, $data);
      }
    }
    return $data;
  }
  public function curlPost($url = &#39;&#39;, $postData = &#39;&#39;, $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;
  }
}

이것이 이 글의 내용입니다. 읽어주셔서 감사합니다. 자세한 내용은 PHP 중국어 웹사이트를 참고하세요!

관련 추천:

php는 WeChat 기본 결제(스캔 코드 결제) 기능을 구현합니다.

위 내용은 PHP는 Alipay 대면결제(스캔코드 결제) 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.