详解PHP实现支付宝小程序用户授权的工具类(3)

这个是构建api独立的业务参数部分方法,businessParam参数是支付宝各个接口的业务参数部分(出去公共参数),$apiMethod是对应的接口的方法名称,如获取token的方法名为alipay.system.oauth.token

签名帮助类

<?php /** * Created by PhpStorm. * User: Auser * Date: 2018/12/4 * Time: 15:37 */ namespace App\Http\Helper; /** *$rsa2 = new Rsa2(); *$data = 'mydata'; //待签名字符串 *$strSign = $rsa2->createSign($data); //生成签名 *$is_ok = $rsa2->verifySign($data, $strSign); //验证签名 */ class RsaHelper { private static $PRIVATE_KEY; private static $PUBLIC_KEY; function __construct(){ self::$PRIVATE_KEY = config('param.amp.private_key'); self::$PUBLIC_KEY = config('param.amp.public_key'); } /** * 获取私钥 * @return bool|resource */ private static function getPrivateKey() { $privKey = self::$PRIVATE_KEY; $privKey = "-----BEGIN RSA PRIVATE KEY-----".PHP_EOL.wordwrap($privKey, 64, PHP_EOL, true).PHP_EOL."-----END RSA PRIVATE KEY-----"; ($privKey) or die('您使用的私钥格式错误,请检查RSA私钥配置'); error_log('private_key is ===========>: '.$privKey); return openssl_pkey_get_private($privKey); } /** * 获取公钥 * @return bool|resource */ private static function getPublicKey() { $publicKey = self::$PUBLIC_KEY; $publicKey = "-----BEGIN RSA PRIVATE KEY-----".PHP_EOL.wordwrap($publicKey, 64, PHP_EOL, true).PHP_EOL."-----END RSA PRIVATE KEY-----"; error_log('public key is : ===========>'.$publicKey); return openssl_pkey_get_public($publicKey); } /** * 创建签名 * @param string $data 数据 * @return null|string */ public function createSign($data = '') { // var_dump(self::getPrivateKey());die; if (!is_string($data)) { return null; } return openssl_sign($data, $sign, self::getPrivateKey(),OPENSSL_ALGO_SHA256 ) ? base64_encode($sign) : null; } /** * 验证签名 * @param string $data 数据 * @param string $sign 签名 * @return bool */ public function verifySign($data = '', $sign = '') { if (!is_string($sign) || !is_string($sign)) { return false; } return (bool)openssl_verify( $data, base64_decode($sign), self::getPublicKey(), OPENSSL_ALGO_SHA256 ); } }

调用

$originUserData = AmpHelper::getAmpUserInfoByAuthCode($code); echo $originUserData;

注意getAmpUserInfoByAuthCode方法,调用接口成功,会返回支付宝用户的正确信息,示例如下

{ "alipay_user_info_share_response": { "code": "10000", "msg": "Success", "user_id": "2088102104794936", "avatar": "http://tfsimg.alipay.com/images/partner/T1uIxXXbpXXXXXXXX", "province": "安徽省", "city": "安庆", "nick_name": "支付宝小二", "is_student_certified": "T", "user_type": "1", "user_status": "T", "is_certified": "T", "gender": "F" }, "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE" }

踩坑点

在开发之前一定要仔细阅读用户的授权流程指引文档,否则很容出错

对于用户信息接口,在获取授权信息接口并没有做明确的说明,所以需要先梳理清楚

支付宝的签名机制和微信的有很大不同,对于习惯了微信小程序开发的人来说,刚开始可能有点不适应,所以需要多看看sdk里面的实现

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4a41632f119614f2ebb611c3c5db96fe.html