PHP 支付宝SDK加密与解密、签名与验签(含php原生写法)

1.使用支付宝SDK,本次使用的SDK是老版

支付宝文档:https://opendocs.alipay.com/open/54/103419

首先下载或使用新上线的Web在线加密,生成应用私钥与应用公钥

以Web在线加密为示例:https://miniu.alipay.com/keytool/create

支付宝SDK代码示例:

目录结构:


代码片段:

<?php
//引入
require_once '../AopClient.php';

class SignTest
{
    protected $aop;
    protected $private_key;
    protected $alipayrsa_public_key;

    public function __construct()
    {
        $aop = new AopClient();
        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';

        $aop->appId = '2021';
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'utf-8';
        $aop->format = 'json';
        
        //应用私钥
        $private_key = 'MIIEpAIBAAKCAQEAwd+e6eZAEW9u0zaOKog5orZMgXR9duL3L+mwUCwb3AntIz6Ofst/AX5TS3g74crjXvfZgD5JMrBoRhPFFxCBb66MfxViinr41J0n0LxHlm/UYAMVcN0795lV0MRmJ9PiplCa/3mxG7prAPukqxAFM5BYvaTBucVSgRKrUVODouxcQuuFvr9uNMNS/T03/mSgWJTRtUHg1Wz9bncnFJUmr56ij10yYIAQD8FjGuga87jKi79/DnSgeF90qUoXeCY6ezlsO8NJ4pwVPqppWBxRSDok4qCPYnPLRmswFB46GViXmL6b4UnI/gxUSj6pFPhq6b3J648sz5RgfTzodOipOQIDAQABAoIBAEFbLkoxaZW3GAgx0vk5lRxqEh5t88G5P5UyVVKhm/6whfWkqArMdRM+z7uYW6+BYubn7LWTyb9BwtUk4wMkeE367LgGsIJ4dBvQotR2NDfdmR2IzJiQrB+K3GgVXU692iEw+R94maD8VggtzNQyAV7hoVjFCt2iTG7gqUowOicYqV+W0fbnhKgDVcRGr6ecybvtTe/VkLpehOwFvUacNnAK3xOCaXAiPu7jM71Uouu0cvs5ypFPp7evpeHnEhgQ5YVT6cnMdBqL2ZC/BxO0KUipraBe1rLvrJw1R6fbwgtjXmpcCX0d2yNiiohCdDI9yKjq2BTGb49J34Ls9TYsHuUCgYEA/39pRqGxKUgTaTlBXsyI55RrlGZb+lqmwmthJTStv0CuXFtD04oSrgvHbv9EnhgntMgrdzZfSx//EqylVSwHJtfvX0nO/zMuGXAYMGCsZJl2yPBZy/pB2gu1quoZbsx89Y9lFnKJn59g8npK/JMpAu+Tt38lmZMLvZ+pDUtqz78CgYEAwkEx4bMAn9g2XTQcD+grQ91OJZlLeAGaLAL/R/CAwzDchDELxHnNKdOnyrBBBt77ERwP5vJBs30dp/Hy8GbmYmr4NSItmqNhGN9sh+QtHKIfKaIn58JdH0RxmLXfpWhld5VgwOWz4zqFQrPXTXuEugTyRGSG6Rcuvl1ejXShxQcCgYEAtzgSMbGADx99tAZ4B1hbkN5Ra2Ef8l+RmHhSeNDXDACBSP+1mvw3uxH9WW67MTgXOUAWU23tVj1CuIyQH4zsMAHHyahvRXjZRSqqXf7lgVq/4QbjDjCPiqK9CyzHQjpoHdxP3JIUeSBc8GWcYpXRYiaV4o/OUdwuHjRhkYQUu5cCgYAwvB6Bm2EauSnadEpeC0dffVQvxqfSccR2KkJVkBcd4VJRr+Rd5Jj+V2WPSmzmBmdCwaGTtU+acldQXTkv6wD9zAx9eBes5jRkAxm9dheDSYE79rzAPlkSkR9WyrpTSz+5orZlbruU1Ie+VlQ70jNYYAlP81CNhg1qIQ6puosjXQKBgQDC1XF0uGc67RXsteOxMx7pRTcB1+PIL/3+Ag2jZ2361qmtlp/JNUyU1ItYknG3CC8PeGaVb9xm7SLh8qP9kgMeA3Xsb55dRgC0i2x5BUvcOSLk2kMTlcfzOAtfV/EBHci8b21SGPzwyM/9hRtguKWaQ6gBB5sbaVmbWo29AqBfEw==';

        $aop->rsaPrivateKey = $private_key;

        //应用公钥
        $alipayrsa_public_key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwd+e6eZAEW9u0zaOKog5orZMgXR9duL3L+mwUCwb3AntIz6Ofst/AX5TS3g74crjXvfZgD5JMrBoRhPFFxCBb66MfxViinr41J0n0LxHlm/UYAMVcN0795lV0MRmJ9PiplCa/3mxG7prAPukqxAFM5BYvaTBucVSgRKrUVODouxcQuuFvr9uNMNS/T03/mSgWJTRtUHg1Wz9bncnFJUmr56ij10yYIAQD8FjGuga87jKi79/DnSgeF90qUoXeCY6ezlsO8NJ4pwVPqppWBxRSDok4qCPYnPLRmswFB46GViXmL6b4UnI/gxUSj6pFPhq6b3J648sz5RgfTzodOipOQIDAQAB';

        $aop->alipayrsaPublicKey = $alipayrsa_public_key;
        $this->aop = $aop;
        $this->private_key = $private_key;
        $this->alipayrsa_public_key = $alipayrsa_public_key;
    }
    
    //生成签名与验签
    public function createSign($type, $sign, $time)
    {
        $content = array();
        $content['a'] = "1";
        $con = json_encode($content);
        $param['app_id'] = '2021';
        $param['method'] = 'www.baidu.com';//接口名称,固定值

        $param['charset'] = 'UTF-8';//请求使用的编码格式

        $param['sign_type'] = 'RSA2';//商户生成签名字符串所使用的签名算法类型

        $param['timestamp'] = $time;//发送请求的时间

        $param['version'] = '1.0';//调用的接口版本,固定为:1.0

        $param['biz_content'] = $con;//业务请求参数的集合,长度不限,json格式,即前面一步得到的
        
        //类型为1 生成签名
        if ($type == 1) {
            $paramStr = $this->aop->getSignContent($param);//组装请求签名参数
            $res = $this->aop->alonersaSign($paramStr, $this->private_key, 'RSA2', false);//生成签名
            return $res;
        } else {
        //类型为2 验证签名,须注意验证签名,就是生成签名的原始数据传回,并把生成的签名传入
            $param['sign'] = $sign;
            $res = $this->aop->rsaCheckV2($param, $this->alipayrsa_public_key, 'RSA2');
            return $res;
        }
    }

    //数据加密
    public function jiami()
    {
        // 加密内容必须为对象信息
        $str = '{"a":112}';
        $res = $this->aop->rsaEncrypt($str, $this->alipayrsa_public_key, 'UTF-8');
        return $res;
    }
    
    //数据解密
    public function jiemi($sign)
    {
        // 解密须先 base64_decode
        $res = $this->aop->rsaDecrypt(base64_decode($sign, true), $this->private_key, 'UTF-8');
        return $res;
    }
}

$type = $_POST['type'];
$aop = new SignTest();
//1为生成签名,2为验证签名
if ($type == 1 || $type == 2) {
    $sign = $_POST['sign'];
    $time = $_POST['time'];
    $res = $aop->createSign($type, $sign, $time);
    echo $res;
}
//数据加密
if ($type == 3) {
    $res = $aop->jiami();
    echo $res;
}
//数据解密
if ($type == 4) {
    // 这是数据加密的值
    $sign = $_POST['sign'];
    $res = $aop->jiemi($sign);
    echo $res;
}


PHP原生写法示例:

class SignTest2
{
    // 应用公钥
    private $public_key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhGYnCecQix/2Pllw5UXMKF3RgryqxXWrgoace8zUumagwX/WMeI0ZjaVFtrkUdiMpANILpB/p1u0AJAifxQuJSijR2a0oQ4zIoFbjm/HDipRcXbkeuMX4gRk863zBevfu0nNAHSReNLu9BaDwAN1OzJPWtxTFtrQ1lzKRIaVCCqDs2WAIlv979G7GQfOETWrgOr1Vy6s69VhGeKgz9+D/MOhWkaTiE+06JesIgH+ohfsH4G+Evz1kf1UYZ+ax3psQZEno3x24fAJt4CGuqj157zrb7OpRAWf/VWT8OAkp6G/y3c+YW22JcAEKlhBjijN8Y/LMoFOfeo7db0kQ51vgwIDAQAB';

    //应用私钥
    private $private_key = 'MIIEpAIBAAKCAQEAhGYnCecQix/2Pllw5UXMKF3RgryqxXWrgoace8zUumagwX/WMeI0ZjaVFtrkUdiMpANILpB/p1u0AJAifxQuJSijR2a0oQ4zIoFbjm/HDipRcXbkeuMX4gRk863zBevfu0nNAHSReNLu9BaDwAN1OzJPWtxTFtrQ1lzKRIaVCCqDs2WAIlv979G7GQfOETWrgOr1Vy6s69VhGeKgz9+D/MOhWkaTiE+06JesIgH+ohfsH4G+Evz1kf1UYZ+ax3psQZEno3x24fAJt4CGuqj157zrb7OpRAWf/VWT8OAkp6G/y3c+YW22JcAEKlhBjijN8Y/LMoFOfeo7db0kQ51vgwIDAQABAoIBADpUavSQ6RfyH+F+NB++bWCHXMtVZYMTAVnDBmQAbOQmXMKDGJHnj6BMgciM7TQlzGhhzcY+AQ9xdk8dMSV9dYsHaVAGrqOaBus3xGdvVWonOLRdZfHB5P69YuB8jWnZbjssG3YM5R4vB/lfhfHtVBOdaZqlILIb+w/F15LzG+t5b5UfvveibPp/HEhDpZJrkmaAlbzqFw8O54XB5ev0wg6kRH8uW/GrVSQqluAuOrrT8TKcfRa8lnIq2P5Fh1QMaWlW7xuYbbzCzNvFYPfY4lqxQUJof6Nk9A62htJhJadsW8GDhyF9kabRQSWP3Xmdlxqw+BvCvBnqtoeCGEGUynkCgYEA7+4B1fOpwL+J3X2Zdjil8JFnGsy51KUMyH9GfH/7iWQ3see/l/lvYrrLGKmYuV5cvU5zD/dXvImVVT5Os0pcjW79Lr9mexzBGTcGvza4bPH07XOsPayGCwu/AoJLnRp3FepZbW+S9UOnRZO+avi7zuNpnVHxReN0hsCi96F3mlUCgYEAjURafLrTkkDwn0FUxhuriXFPhZ9tUUZwKEdAxrp1dXsZL1o+Uj6rD+gqKSMx9nEPKA42N9Y98fY6PFLzXfu2slwVjQkCff1WpYpFX05w4ijz6GyidT+OVyON2QCjDWlYomWxhmMLuvK41jgKXtRitrh2pMl+XTNvBoia4+Mn6ncCgYEAnft5B/kOcJVuYQJ/1wFL+pCzdEkTn7oiJa7wqa/X38q2hZVUaexbdIYMjyu1HXHN3PTX/M5f3gw14VBKn/G56YMIgQyUnUH8v+6kqamNXGchYG0HIAEGriVI240R3tt7SFnsEowiFw86CC1Vd7haacsCUw2OsfcoVkZnyGhwiZUCgYA7a+ggFToPiA9u/b0aA+OY0bfgfhoumNFur+IYdbAYtan3WB9k2wV7kG3DlhFbF12HvMqjnBO8ZpVCcKX7/3hu9/r8szCALIM46LubhlRHXXCTcLa5WP2Xu9Xb1L/BUXG+Bcaxv5HclmKXgUUjdHT9ZQRK9pKXw53NAsMcXp2YqwKBgQCbpJs1vYCwbNWF3POYdMYGWRwNgt04277/uI8gcJt0NCBJ1HvAGo6D8uT+l//8l9tMs8eOwGSIg5xdwA4v2UOgb1N10Qm1x3/T2D+V1+RO4mrDGUpSmBDVtQYnDIdjfRitERUI1+1HIRPJ7qBMsQbSc9ySZ5WE4Aroq/zDmBha2A==';

    // 数据加密
    public function jiami()
    {
        $publicKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($this->public_key, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
        //需要加密的数据
        $data = [
          'order_no' => '20212193123',
          'money' => 99,
          'user_id' => 12,
          'pay_time' => '2021-6-18 17:02:00'
        ];

        $publicKey = openssl_pkey_get_public($publicKey); //解析公钥
        $res = openssl_public_encrypt(json_encode($data), $encrypted, $publicKey) ? base64_encode($encrypted) : null;
        return $res;
    }

    // 解密
    public function jiemi($encrypted)
    {
        $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->private_key . "\n-----END RSA PRIVATE KEY-----";
        $key = openssl_pkey_get_private($privateKey); //解析私钥
        $encrypted = base64_decode($encrypted);
        //解密
        $res = openssl_private_decrypt($encrypted, $decrypted, $key) ? $decrypted : null;
        return $res;
    }

    //生成签名
    public function qianming()
    {
        //要签名的数据
        $data = [
          'order_no' => '20212193123',
          'money' => 99,
          'user_id' => 12,
          'pay_time' => '2021-6-18 17:02:00'
        ];
        $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->private_key . "\n-----END RSA PRIVATE KEY-----";
        $privateKey = openssl_pkey_get_private($privateKey);
        $res = openssl_sign(json_encode($data), $sign, $privateKey, OPENSSL_ALGO_SHA256) ? base64_encode($sign) : null;
        return $res;
    }

    //验签
    public function yanqian($sign)
    {
        //原始数据
        $data = [
          'order_no' => '20212193123',
          'money' => 99,
          'user_id' => 12,
          'pay_time' => '2021-6-18 17:02:00'
        ];
        $publicKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($this->public_key, 64, "\n", true) . "\n-----END PUBLIC KEY-----";
        $publicKey = openssl_pkey_get_public($publicKey);
        $res = openssl_verify(json_encode($data), base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256);
        return $res ? '正确' : '错误';
    }
}

$test = new SignTest2();
$type1 = $_POST['type1'];
//数据加密
if ($type1 == 1) {
    $res = $test->jiami();
    echo $res;
}
//加密数据解密
if ($type1 == 2) {
    $sign = $_POST['sign'];
    $res = $test->jiemi($sign);
    echo $res;
}
//数据加密
if ($type1 == 3) {
    $res = $test->qianming();
    echo $res;
}
//加密数据解密
if ($type1 == 4) {
    $sign = $_POST['sign'];
    $res = $test->yanqian($sign);
    echo $res;
}

写在最后:

这只是记录加密与解密,签名与验签的简单使用,供学习参考,谢谢!

可以相互交流学习一下哦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值