iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本
  • 280
分享到

PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本

服务器java运维 2023-09-03 08:09:43 280人浏览 独家记忆
摘要

支付宝某些业务只能使用公钥证书方式来验签 如:即使转账      红包等 笔者就要实现这样一个功能,【单笔转账到支付宝账户】,采用支付宝公钥证书签名来实现。 话不多说,流程先走起 第一步:下载支付宝秘钥生成器 由于我们使用的是PHP鱼

支付宝某些业务只能使用公钥证书方式来验签

如:即使转账

     红包等

笔者就要实现这样一个功能,【单笔转账到支付宝账户】,采用支付宝公钥证书签名来实现。

话不多说,流程先走起

第一步:下载支付宝秘钥生成器

由于我们使用的是PHP鱼油,点击pkcs1(非java适用)

按照上面图中的 三个步骤操作,操作完成后,点击【打开文件位置】,可以看到下面这些文件

会有

  1. 一个csr文件
  2. 一个公钥
  3. 一个私钥

我们将csr文件上传到支付宝 接口加签方式 里面,然后讲下图里面的三个整数下载下来

 

分别是:

  • alipayCertPublicKey_RSA2.crt
  • alipayRootCert.crt
  • appCertPublicKey_202100000023232.crt

第二步,配置php配置

我们将 上面生成的三个文件复制到证书目录,如图:

配置代码如下:

 '', // 支付宝应用的appid    'alipay_root_cert_sn' => BASE_PATH . '/cert/alipayRootCert.crt', // 支付宝根证书在自己服务器的绝对路径    'app_cert_sn' => BASE_PATH . '/cert/appCertPublicKey_2021000199651454.crt', // 应用公钥证书在自己服务器绝对路径    'rsa_private_key' => '' // 这个是RSA签名,特别要注意的是,是我们第一步中的对应自己域名的那个私钥哦];

 

编写AlipayTransServer

class AlipayTransfers{    protected $appId;    //私钥值    protected $rsaPrivateKey;        private $charset;     public function __construct($appid, $saPrivateKey)    {        $this->appId = $appid;        $this->charset = 'utf8';        $this->rsaPrivateKey = $saPrivateKey;    }         public function doPay($totalFee, $outTradeNo, $account, $realName, $remark = '')    {        //请求参数        $requestConfigs = array(            'out_biz_no' => $outTradeNo,            'payee_type' => 'ALIPAY_LOGONID',            'payee_account' => $account,            'payee_real_name' => $realName,  //收款方真实姓名            'amount' => $totalFee, //转账金额,单位:元。            'remark' => $remark,  //转账备注(选填)        );        $commonConfigs = array(            //公共参数            'app_id' => $this->appId,            'method' => 'alipay.fund.trans.toaccount.transfer',             //接口名称            'format' => 'JSON',            'charset' => $this->charset,            'sign_type' => 'RSA2',            'timestamp' => date('Y-m-d H:i:s'),            'alipay_root_cert_sn' => $this->getRootCertSN(BASE_PATH . '/cert/alipayRootCert.crt'),//支付宝根证书SN(alipay_root_cert_sn)            'app_cert_sn' => $this->getCertSN(BASE_PATH . '/cert/appCertPublicKey_2021000199651454.crt'), //应用公钥证书SN(app_cert_sn)            'version' => '1.0',            'biz_content' => json_encode($requestConfigs),        );        $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);        $result = $this->curlPost('https://openapi.alipay.com/gateway.do', $commonConfigs);        $resultArr = json_decode($result, true);        if (empty($resultArr)) {            $result = iconv('GBK', 'UTF-8//IGNORE', $result);            return json_decode($result, true);        }        return $resultArr;    }     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;    }         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;    }         function characet($data, $targetCharset)    {        if (!empty($data)) {            $fileType = $this->charset;            if (strcasecmp($fileType, $targetCharset) != 0) {                $data = mb_convert_encoding($data, $targetCharset, $fileType);            }        }        return $data;    }     public function curlPost($url = '', $postData = '', $options = array())    {        if (is_array($postData)) {            $url = $url . '?' . http_build_query($postData);            cli_log($url);        }        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        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;    }         public function getCertSN($certPath)    {        $cert = file_get_contents($certPath);        $ssl = openssl_x509_parse($cert);        $SN = md5($this->array2string(array_reverse($ssl['issuer'])) . $ssl['serialNumber']);        return $SN;    }         public function getRootCertSN($certPath)    {        $cert = file_get_contents($certPath);        $array = explode("-----END CERTIFICATE-----", $cert);        $SN = null;        for ($i = 0; $i < count($array) - 1; $i++) {            $ssl[$i] = openssl_x509_parse($array[$i] . "-----END CERTIFICATE-----");            if (strpos($ssl[$i]['serialNumber'], '0x') === 0) {                $ssl[$i]['serialNumber'] = $this->hex2dec($ssl[$i]['serialNumber']);            }            if ($ssl[$i]['signatureTypeLN'] == "sha1WithRSAEncryption" || $ssl[$i]['signatureTypeLN'] == "sha256WithRSAEncryption") {                if ($SN == null) {                    $SN = md5($this->array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);                } else {                     $SN = $SN . "_" . md5($this->array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);                }            }        }        return $SN;    }         protected function hex2dec($hex)    {        $dec = 0;        $len = strlen($hex);        for ($i = 1; $i <= $len; $i++) {            $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));        }        return $dec;    }     protected function array2string($array)    {        $string = [];        if ($array && is_array($array)) {            foreach ($array as $key => $value) {                $string[] = $key . '=' . $value;            }        }        return implode(',', $string);    }}

实现业务部分:

      

          public function transfer($realName, $account, $amount, $remark = '提现')    {        $aliConfig = config('alipay');        $aliTransfers = new Transfers($aliConfig['app_id'], $aliConfig['rsa_private_key']);        $outTradeNo = date('Ymd') . time() . rand_string(6, true);        return $aliTransfers->doPay($amount, $outTradeNo, $account, $realName, $remark);    }

来源地址:https://blog.csdn.net/weixin_46742102/article/details/130092969

--结束END--

本文标题: PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本

本文链接: https://www.lsjlt.com/news/391900.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本
    支付宝某些业务只能使用公钥证书方式来验签 如:即使转账      红包等 笔者就要实现这样一个功能,【单笔转账到支付宝账户】,采用支付宝公钥证书签名来实现。 话不多说,流程先走起 第一步:下载支付宝秘钥生成器 由于我们使用的是php鱼...
    99+
    2023-09-03
    服务器 java 运维
  • PHP 实现支付宝 “(单笔转账)转账到支付宝账号”
    目录 前言 一、服务层 二、控制层 1.控制层 2.接口返回参数实例 前言 单笔转账接口 | 网页&移动应用 准备: 应用的证书(证书申请和配置可以参考我另一篇分享“支付宝 ‘应用证书配置’ ”) 配置证书后注意公共参数中 私钥值 是c...
    99+
    2023-09-01
    php mysql
  • PHP 实现微信支付 “商家转账到零钱”
    目录 一、日常填坑:注意事项 二、代码示例 1.微信服务层 2.请求层 总结 一、日常填坑:注意事项 转账低于5毛会失败 转账金额需要自己取整一下,不然运气来了会出现以下问题 { "code":"PARAM_ERROR",...
    99+
    2023-09-01
    php 微信 http
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作