国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程式 微信開發(fā) 分享微信支付v3版 php解密解密程式碼

分享微信支付v3版 php解密解密程式碼

Jul 15, 2021 pm 01:50 PM

微信支付V3版本小程式支付php簽名,驗(yàn)簽,資料解密程式碼分享

微信支付v3版php解密解密碼

資料解密需要用到sodium擴(kuò)充大部分php版本需要安裝

憑證序號(hào)可以在這裡查看https://myssl.com/cert_decode.html

我使用的php7.4版本

直接上程式碼:

//微信原生支付
class Wxpay
{
    /*
     * 支付(小程序支付)
     * @param type $sn        訂單編號(hào)
     * @param type $money  金額
     * @param type $openid  用戶小程序openid
     * @return type
     */
    public static function getPayParam($sn, $money, $openid)
    {
        $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi';
        $notify_url = url('/api/weixin/notify');
        $data = [];
        $data['appid'] = Action::config(CONFIG_WXXCX, 'app_id');
        $data['mchid'] = Action::config(CONFIG_WXXCX, 'mchid'); //商戶號(hào)
        $data['description'] = 'xxx'; //描述?
        $data['out_trade_no'] = $sn; //商戶系統(tǒng)內(nèi)部訂單號(hào)
        $data['time_expire'] = date('Y-m-d') . 'T' . date('H:i:s', (time() + 1800)) . '+08:00'; //訂單失效時(shí)間2018-06-08T10:34:56+08:00
        $data['notify_url'] = $notify_url; //異步通知接口地址
        $data['amount'] = ['total' => $money * 100, 'currency' => 'CNY']; //金額
        $data['payer'] = ['openid' => $openid]; //用戶
        $re = self::wxCurl($url, $data, 'POST');
        if (!isset($re['prepay_id'])) {
            api_fail('參數(shù)獲取失敗');
        }
        $result = [];
        $result['appId'] = Action::config(CONFIG_WXXCX, 'app_id');
        $result['timeStamp'] = (string)time();
        $result['nonceStr'] = uniqid();
        $result['package'] = 'prepay_id=' . $re['prepay_id'];
        $result['signType'] = 'RSA';
        $result['paySign'] = self::getPaySign($result);
        return $result;
    }
    /**
     * 查詢訂單
     * @param type $sn
     */
    public static function select($sn, $return = false)
    {
        $mchid = Action::config(CONFIG_WXXCX, 'mchid'); //商戶號(hào)
        $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/' . $sn . '?mchid=' . $mchid;
        $re = self::wxCurl($url, [], 'GET');
        if ($return) {
            return $re;
        }
        if (isset($re['trade_state']) && $re['trade_state'] == 'SUCCESS') {
            return true;
        }
        return false;
    }
    /**
     * 關(guān)閉訂單
     * @param type $sn
     */
    public static function close($sn)
    {
        $mchid = Action::config(CONFIG_WXXCX, 'mchid'); //商戶號(hào)
        $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/' . $sn . '/close';
        $re = self::wxCurl($url, ['mchid'=>$mchid], 'POST');
        return true;
    }
    /**
     * 退款
     * @param type $sn
     */
    public static function refund($order_sn,$refund_sn,$total,$refund,$msg='退款')
    {
        $url='https://api.mch.weixin.qq.com/v3/refund/domestic/refunds';
        $data=[];
        $data['notify_url']=url('ag/weixin/notify_refund');
        $data['out_trade_no']=$order_sn;//訂單號(hào)
        $data['out_refund_no']=$refund_sn;//退款單號(hào)
        $data['reason']=$msg;
        $data['amount']=['refund'=>$refund*100,'total'=>$total*100,'currency'=>'CNY'];
        $re = self::wxCurl($url, $data, 'POST');
        return $re;
    }
    //請(qǐng)求
    public static function wxCurl($url, $data = [], $method = 'GET')
    {
        $Authorization = self::getReSign($url, $data, $method);
        $header = [
            'Content-Type: application/json',
            'Accept: application/json',
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63',
            'Authorization: ' . $Authorization
        ];
        $redata = $data ? json_encode($data) : '';
        $res = reCurl($url, $redata, $header);
        return $res ? json_decode($res, true) : [];
    }
    //后端請(qǐng)求簽名
    public static function getReSign($url, $data, $method = 'GET')
    {
        $url_parts = parse_url($url);
        $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
        $http_method = $method;
        $timestamp = time();
        $nonce = uniqid();
        $body = $data ? json_encode($data) : '';
        $mchid = Action::config(CONFIG_WXXCX, 'mchid'); //商戶id
        $serial_no = Action::config(CONFIG_WXXCX, 'serial_no'); //證書編號(hào)
        $private_key = self::getPrivateKey(BASE_PATH . 'cert/apiclient_key.pem'); //商戶私鑰
        $message = $http_method . "\n" .
            $canonical_url . "\n" .
            $timestamp . "\n" .
            $nonce . "\n" .
            $body . "\n";
        openssl_sign($message, $raw_sign, $private_key, 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);
        $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"', $mchid, $nonce, $timestamp, $serial_no, $sign);
        return 'WECHATPAY2-SHA256-RSA2048 ' . $token;
    }
    //前端小程序簽名
    public static function getPaySign($result)
    {
        $private_key = self::getPrivateKey(BASE_PATH . 'cert/apiclient_key.pem'); //商戶私鑰
        $message = $result['appId'] . "\n" .
            $result['timeStamp'] . "\n" .
            $result['nonceStr'] . "\n" .
            $result['package'] . "\n";
        openssl_sign($message, $raw_sign, $private_key, 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);
        return $sign;
    }
    //驗(yàn)證簽名
    public static function checkSign()
    {
        $header = Context::get('header');
        $serial_no = $header['wechatpay-serial'] ?? ''; //微信平臺(tái)序列號(hào)
        $timeStamp = $header['wechatpay-timestamp'] ?? '';
        $nonce = $header['wechatpay-nonce'] ?? '';
        $body = Context::get('raw');
        $wx_sign = $header['wechatpay-signature'] ?? '';
        $wx_serial_no = Action::config(CONFIG_WXXCX, 'wx_serial_no');//保存的序列號(hào)
        if (!$serial_no || $wx_serial_no != $serial_no) {
            \sff\Log::write('簽名過期');
            return false;
        }
        $message = $timeStamp . "\n" .
            $nonce . "\n" .
            $body . "\n";
        
        $wx_sign = base64_decode($wx_sign);
        $public_key = self::getPublicKey(BASE_PATH . 'cert/wx_public_cert.pem'); //平臺(tái)公鑰
        $res = openssl_verify($message, $wx_sign, $public_key, OPENSSL_ALGO_SHA256);
        if ($res == 1) {
            return true;
        }
        \sff\Log::write('驗(yàn)簽失敗');
        return false;
    }
    //獲取私鑰
    public static function getPrivateKey($filepath)
    {
        return openssl_get_privatekey(file_get_contents($filepath));
    }
    //獲取公鑰
    public static function getPublicKey($filepath)
    {
        return openssl_pkey_get_public(file_get_contents($filepath));
    }
    //加密數(shù)據(jù)
    public static function getEncrypt($str)
    {
//$str是待加密字符串 
        $public_key_path = BASE_PATH . 'cert/wx_public_cert.pem'; //'平臺(tái)證書路徑';
        $public_key = file_get_contents($public_key_path);
        $encrypted = '';
        if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
            //base64編碼 
            $sign = base64_encode($encrypted);
        } else {
            throw new Exception('encrypt failed');
        }
        return $sign;
    }
    //解密數(shù)據(jù)
    public static function decryptToString($ciphertext, $associatedData, $nonceStr)
    {
        $aesKey = Action::config(CONFIG_WXXCX, 'mch_keyv3'); //商戶apiv3密鑰解密
        $str = base64_decode($ciphertext);
        if (strlen($str) <= 16) {
            return &#39;&#39;;
        }
        // ext-sodium (default installed on >= PHP 7.2)
        return \sodium_crypto_aead_aes256gcm_decrypt($str, $associatedData, $nonceStr, $aesKey);
    }
    //下載平臺(tái)證書
    public static function downCert()
    {
        $url = &#39;https://api.mch.weixin.qq.com/v3/certificates&#39;;
        $re = self::wxCurl($url, [], &#39;GET&#39;);
        if (!isset($re[&#39;data&#39;])) {
            api_fail(&#39;獲取證書失敗&#39;);
        }
        $ciphertext = $re[&#39;data&#39;][0][&#39;encrypt_certificate&#39;][&#39;ciphertext&#39;];
        $associatedData = $re[&#39;data&#39;][0][&#39;encrypt_certificate&#39;][&#39;associated_data&#39;];
        $nonceStr = $re[&#39;data&#39;][0][&#39;encrypt_certificate&#39;][&#39;nonce&#39;];
        $data = self::decryptToString($ciphertext, $associatedData, $nonceStr);
        if (!$data) {
            api_fail(&#39;獲取證書解密失敗&#39;);
        }
        file_put_contents(BASE_PATH . &#39;/cert/wx_public_cert.pem&#39;, $data);
        return $data;
    }
}

以上是分享微信支付v3版 php解密解密程式碼的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)