当前位置: 首页 > news >正文

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

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

如:即使转账

     红包等

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

话不多说,流程先走起

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

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

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

会有

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

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

 

分别是:

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

第二步,配置PHP配置

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

配置代码如下:

<?php
return ['app_id' => '', // 支付宝应用的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;/*** @var string*/private $charset;public function __construct($appid, $saPrivateKey){$this->appId = $appid;$this->charset = 'utf8';$this->rsaPrivateKey = $saPrivateKey;}/*** 转帐* @param float $totalFee 转账金额,单位:元。* @param string $outTradeNo 商户转账唯一订单号* @param string $remark 转帐备注* @return array*/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;}/*** 校验$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);}}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请求 不验证证书和hostcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$data = curl_exec($ch);curl_close($ch);return $data;}/*** 从证书中提取**** @param $cert* @return string*/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;}/*** 提取根证书**** @param $cert  根证书* @return string|null*/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;}/*** 0x转高精度数字* @param $hex* @return int|string*/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);}
}

实现业务部分:

      

      /*** 转账提现* @param $realName 收款人真实姓名* @param $account  收款人账号* @param $amount  付款金额* @param string $remark 付款备注* @return array|void*/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);}

http://www.lryc.cn/news/58830.html

相关文章:

  • 第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 E 题
  • Python 小型项目大全 21~25
  • MinIO从信息泄漏到RCE
  • 202.Spark(九):SparkStreaming案例实操
  • GlusterFS(GFS)分布式文件系统
  • ChatGPT文本框再次升级,打造出新型操作系统
  • DPU02国产USB转UART控制芯片替代CP2102
  • Softing新版HART多路复用器软件支持西门子控制器
  • 〖Python网络爬虫实战⑫〗- XPATH语法介绍
  • 实例方法、类方法、静态方法、实例属性、类属性
  • 数据结构---二叉树
  • CMake——从入门到百公里加速6.7s
  • 无公网IP,在外公网远程访问RabbitMQ服务「内网穿透」
  • Node【二】NPM
  • 【2023最新】超详细图文保姆级教程:App开发新手入门(2)
  • sftp使用
  • FastGithub---------不再为访问github苦恼
  • Spring Boot AOP @Pointcut拦截注解的表达式与运算符
  • 2023年第十四届蓝桥杯javaB组省赛真题
  • CefSharp.WinForms 112.2.70最新版体验
  • leetcode每日一题:数组篇(1/2)
  • 每个企业经营者都应该了解的几个网络安全趋势
  • IDEA操作MongoDB快速上手开发
  • 从FPGA说起的深度学习(六)-任务并行性
  • 5.39 综合案例2.0 - STM32蓝牙遥控小车4(体感控制)
  • Scala之面向对象
  • 深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行
  • 嵌入式工程师如何快速的阅读datasheet的方法
  • (三)合约广告
  • 【Android -- 软技能】分享一个学习方法