php 单笔转账到支付宝账户,支付宝公钥证书实现版本
支付宝某些业务只能使用公钥证书方式来验签
如:即使转账
红包等
笔者就要实现这样一个功能,【单笔转账到支付宝账户】,采用支付宝公钥证书签名来实现。
话不多说,流程先走起
第一步:下载支付宝秘钥生成器
由于我们使用的是php鱼油,点击pkcs1(非java适用)
按照上面图中的 三个步骤操作,操作完成后,点击【打开文件位置】,可以看到下面这些文件
会有
- 一个csr文件
- 一个公钥
- 一个私钥
我们将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);}
然后,我们去调用transfer 控制器,传入对应参数就可以了哦;
php 单笔转账到支付宝账户,支付宝公钥证书实现版本相关推荐
- java支付宝提现功能,单笔转账到支付宝账户(公钥证书方式)
最近在开发商户分润系统(给商户分红),涉及到给商户账号提现功能,我们使用的是支付宝转账,通过公钥证书方式实现的. 在支付宝开放平台里找了好久的开发文档,但是介绍更多的是普通公钥的方式,这个方式比较简单 ...
- java 支付宝转账_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝订单退款)...
上一篇写到支付宝的支付,这代码copy下来就能直接用了, 我写学习文档时会经常贴 官方参数文档的案例地址, 因为我觉得 请求参数,响应参数说明 官方文档整理的很好,毕竟官方不会误导大家. 我学一个 ...
- PHP支付宝转账到支付宝账号/支付(公钥证书方式)
最近开发涉及到了支付宝转账到支付宝账号功能,接下来由应用申请开始到代码模块来简单说下流程. 1.准备工作:支付宝控制台 应用申请-接口申请 第一步创建对应应用 第二步申请转账接口(需要商家账号) 第三 ...
- 支付宝 php rsa2,#支付宝 RSA2和公钥证书签名验签的区别?
报错原因 1.密钥不匹配 2.编码格式不统一 3.请求参数数据有误 4.接口调用加签方式和应用上选择的加签方式不对应 5.sdk调用的提交方法有误 6.sdk运行环境有误 排查方案 1.匹配不密钥 ( ...
- 支付宝支付-升级公钥证书
原因 项目需要实现自动提现到支付宝,涉及到资金类支出接口 ,所以需要升级密钥为公钥证书: 参考文档:支付宝密钥相关文档 准备证书 生成csr时保存下来的2个.txt(应用公钥没啥用,应用私钥需要妥善保 ...
- 支付宝支付+退款(公钥证书方式+普通公钥方式)app+java
支付宝的签名方式有两种(普通公钥方式.公钥证书方式),一般最常用的就是普通公钥方式,也相对比较简单,但是公钥证书方式是现在支付宝支付官方文档上面推荐的签名方式. 申请步骤可以参照官方文档: 参考链接: ...
- java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 然后创建应用 ...
- Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, ...
- php 个人账户转账,alipay.fund.trans.uni.transfer(单笔转账到支付宝账户接口PHP示例)
单笔转账接口是基于支付宝的资金处理能力,为了满足支付宝商家的转账需求,针对有部分开发能力的商家,提供通过API接口完成企业自身支付宝账户到支付宝账户.企业自身支付宝账户到银行卡的转账功能. 适用于:C ...
最新文章
- 解决:geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic
- 走过2010,期盼2011!
- python函数知识四 迭代器、生成器
- SAP云平台与企业数字型转型
- java string fill_Java使用fill()数组填充的实现
- Adobe illustrator 论文图形编辑和排版 - 连载 2
- Java描述设计模式(16):代理模式
- Jenkins环境搭建和部署项目的过程
- 删除顽固文件夹cygwin的方法,挺折腾的
- 刘作虎:今年一加9系列不会送测DxO
- java skip_Java LongStream skip()用法及代码示例
- 这个SSRF 漏洞很酷
- 服务器放在机柜_机架式服务器和塔式服务器有区别吗
- python setup.py卸载
- 本周小结!(回溯算法系列三)
- 组件中使用_Cocos Creator中Button组件使用详解
- Android App开发实战项目之电子书架的实现(附源码 简单易懂 可直接使用)
- 区块链底层平台有哪些 区块链底层平台搭建
- 安利超实用的(cc协议)游戏3d模型素材网站
- 2021年危险化学品生产单位安全生产管理人员复审考试及危险化学品生产单位安全生产管理人员模拟考试题库
热门文章
- 【2016浴雨沐风】(第一篇)
- 今日头条2018校招编程题
- 小米max3支持html吗,小米Max3这款手机是否有OTG功能,支持OTG鼠标和U盘吗?
- 手指滑动控制系统全局音量的程序(中)
- 自签名证书报错:javax.net.ssl.SSLPeerUnverifiedException: Hostname xxx not verified
- 【BeetSQL入门学习】
- Win10 或者Win7 64位系统安装32位的CAD2010教程
- 快讯:预装Ubuntu 11.10小电脑南非开卖
- kettle脚本Linux执行,kettle在linux下面用于shell脚本执行:转换或者作业
- android 文件存储基础