php支付宝系列之电脑网站支付


Posted in PHP onMay 30, 2018

网上的很多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'; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID
$returnUrl = 'http://www.xxx.com/alipay/return.php';   //付款成功后的同步回调地址
$notifyUrl = 'http://www.xxx.com/alipay/notify.php';   //付款成功后的异步回调地址
$outTradeNo = uniqid();   //你自己的商品订单号
$payAmount = 0.01;     //付款金额,单位:元
$orderName = '支付测试';  //订单标题
$signType = 'RSA2';    //签名算法类型,支持RSA2和RSA,推荐使用RSA2
//商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310
$saPrivateKey='MIIEpAIBAAKCAQEA1MV+OY6MvGfXPM0MkpjT+FdzGmPOvVmX2wF3gjwQpeHBEUP9jLXhVS32fZ1iXI1e7WUGQ5tvXn28P8190kpOn/c/G5t2CAksUvemvF7uJN/N3Z1HFMdt3omvCd14K05lgcFYz7Z4c+A7ZJF5bPCB6oshjjUmbCY3hibuWzX/1j8AgsoD9lLyxoFqxLj98k5ZrYIhk900gMQs/WJ3A1FC09Dln9fuhBUyjtPHaml+4w+sdkdzxPktxdFrMcI7M7rNEwg25XtST5Z49oFpE84AlXM7+oC9jYvIpTGE00WomsgtakN039ucT/59Bup6pLkO08Rv85UXbqzGTcYAhNHLfQIDAQABAoIBAQCbuP258s+j8KgB8ty5yiqRPoeaj+O2h4Txn7A02/sfPQvNtCI0wsTpT5twsihULo+EVYTxJCitUn7df2sP5pyGzTEd5njLRtNu4Zvhj+Thjf8grERiu9b4oXI/WRzjLRxzi+uREi40OK+fWi0xgxDCdROY/eNiEdJfV8zpaqsUxG7VdwZIJQ/8d3Mi31OWv30kr9jfEd15DBInGJgSqR+qwrAB4pBSMcW8hL6PYlzoPi1ygceFjRrnbefG40zt0OUPSexQIgAmFvGqxTl5xo3dFEziGHdfWYsBKZ2M8ubAe+R6LcndxI+o2Hw4TNcC1tDeNMtjw7+h9S5aef5A8uWBAoGBAPxCLWPhUHCYlIXUz0D1SoolZs9WK7Kz1YSWnzqrpegN+foS5/ji93YylGE+KL31TwbnGQLAwknwMX3qTzmkvTovmy8jevXBsCSEFm81q0wG/35e1SKkTXL66RqB2y0xFLdcF3f9s8ZiEclqkYwNSHh0nqzREfIxMMAsj+3n2vHdAoGBANftYkZYrbs4iI/ZcjmBYguYikNfNmrD+Ta6ckOGZqsHfwXJCAz1rF4/XCqVAc9nxuzJR/72qkn9z07uH6qSZCqlZDRkiiKaK2UVqFDB+0abMk/TGHXuMmdvMkyj2jEZxG2rkg0kmg4qYkkg/5tGG1On/0GeZNVPu8JpsFr1pDYhAoGBANr8pCTKC6fDfWP1C3qrtmrY7zhc6RB4d4pjq5UmP5+EypaiZQi2F/dfD1qfuIS3eURXyGmQZtoDDyPtDZvP/ImPnFs+pNbFryD0HfmrEKquhIvyzXoGQknnsgbV5iy3KCTJaII9FxzINAKzZei7+0a+jqUd1kN3Gogp50Sze2ltAoGARaM5Xpaa8RZ6dGocfI9Nn4/Ch5fdZPFvHkdjMoPV+LKiNKtw/Tz+KiclAlasDsfZT+RaY9AJe3NvuHTzoX807swIVR1Xr3EpLaCed+0XrN3AjB34dZAskU87WZw+cjdtMjFzGOoFBSyGJi+OP/WMOp6jo/YBbwoX88tCJROzsgECgYAT8pHHIyPt5Y/5pDb8EDvD3XNES1fBkfZffSoAodsrkeoKgrsKl+9M3rcGX+S9dscyoH0ur3BFTMHtIOOhC5qytt+BhMHIP5mAs4di4u/joQCWQbUyrUggVK5it+6BFgAT+jeB7zTAUtgGpTVFq3kLbV0NZ+XQyEHVlnoJnHYpQg==';
$aliPay = new AlipayService($appid,$returnUrl,$notifyUrl,$saPrivateKey);
$sHtml = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl);
echo $sHtml;

class AlipayService
{
  protected $appId;
  protected $returnUrl;
  protected $notifyUrl;
  protected $charset;
  //私钥值
  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,
      '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属性
    $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('您使用的私钥格式错误,请检查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;
  }
}

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

PHP 相关文章推荐
E路文章系统PHP
Dec 11 PHP
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
php xml实例 留言本
Mar 20 PHP
url decode problem 解决方法
Dec 26 PHP
php新浪微博登录接口用法实例
Dec 23 PHP
php实现通过ftp上传文件
Jun 19 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
php日志函数error_log用法实例分析
Sep 23 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 PHP
Laravel框架使用Redis的方法详解
May 30 #PHP
php实现微信支付之退款功能
May 30 #PHP
分享5个非常有用的Laravel Blade指令
May 30 #PHP
php实现微信支付之企业付款
May 30 #PHP
ThinkPHP5框架缓存查询操作分析
May 30 #PHP
PHP实现通过CURL上传文件功能示例
May 30 #PHP
php实现微信支付之现金红包
May 30 #PHP
You might like
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
python中使用序列的方法
2015/08/03 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python 修改列表中的元素方法
2018/06/26 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
工作自我评价分享
2013/12/01 职场文书
五一服装活动方案
2014/01/11 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
士力架广告词
2014/03/20 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
财务年终工作总结大全
2019/06/20 职场文书