微信支付企业付款到银行卡——一键生成公钥RSA加密,以及测试

代码备份录——一键生成公钥(很讨厌某些人,写个demo接口还要收费?)

代码

<?php

namespace App\Console\Commands;

use App\Traits\bladeTrait;
use Illuminate\Console\Command;
use Illuminate\Support\Str;

class PublicEm extends Command{
    use bladeTrait;
    protected $signature = 'command:pub-key';
    protected $description = '用于生成生成微信商户号付款至银行卡的公钥,需要在服务器使用';

    /**
     * 1、env文件配置商户号和key
     * 2、生成public.pem文件
     * 3、转换publicpkcs8.pem文件
     * 4、测试加密内容
     * apiclient_cert.p12
     * @return mixed
     */
    public function handle(){

        $mch_id = env("PROJECT_MCH_ID");
        $key = env("PROJECT_MCH_KEY");

        echo "读取配置" . PHP_EOL;
        echo "商户号" .$mch_id. PHP_EOL;
        echo "秘钥" .$key. PHP_EOL;
        echo "开始生成public.pem" . PHP_EOL;

        $data = [
            "mch_id"=>$mch_id,
            "nonce_str"=>Str::random(32),
            "sign_type"=>"MD5",
        ];

        ksort($data);
        $headData = $this->newToUrlParams($data);
        $sign = strtoupper(md5($headData."&key=".$key));
        $data = array_merge($data,[
            "sign"=>$sign
        ]);

        $xmlData = $this->newToXml($data);
        $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,"https://fraud.mch.weixin.qq.com/risk/getpublickey");
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl,CURLOPT_POST,true);
        curl_setopt($curl,CURLOPT_POSTFIELDS,$xmlData);
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($curl,CURLOPT_SSLCERT,app_path('Cert/'.$mch_id.'apiclient_cert.pem'));
        curl_setopt($curl,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($curl,CURLOPT_SSLKEY,app_path('Cert/'.$mch_id.'apiclient_key.pem'));
        $string = curl_exec($curl);
        $error = curl_error($curl);
        curl_close($curl);
        if($error){
            echo "curl失败" . PHP_EOL;
            echo $error . PHP_EOL;
            return;
        }else{
            echo "curl成功" . PHP_EOL;
            $strpostData = simplexml_load_string($string);
            $stringData = [];
            foreach ($strpostData->children() as $child){
                $stringData = array_merge($stringData,array($child->getName()=>(string)$child));
            } file_put_contents(app_path("Cert")."/".$stringData["mch_id"]."public.pem",$stringData["pub_key"]);

            echo "生成文件成功" . PHP_EOL;

            // linux命令转换证书格式
            // openssl rsa -RSAPublicKey_in -in 1456790502public.pem -pubout

            exec("
            cd ".app_path("Cert")." \n
            openssl rsa -RSAPublicKey_in -in ".$stringData["mch_id"]."public.pem -pubout", $result, $var);

            echo "pem转pkcs8成功" . PHP_EOL;
            foreach ($result as $item){ file_put_contents(app_path("Cert")."/".$stringData["mch_id"]."public_pkcs8.pem",$item.PHP_EOL,FILE_APPEND);
            }

            echo "测试加密字段..." . PHP_EOL;

            $data = "张三";
            $pub_key = file_get_contents(app_path("Cert")."/".$mch_id."publicpkcs8.pem");
            $r = openssl_public_encrypt($data,$encrypt_data,$pub_key,OPENSSL_PKCS1_PADDING);

            if($r){
                echo "测试正常..." . PHP_EOL;
                echo base64_encode($encrypt_data). PHP_EOL;
            }else{
                echo "测试异常..." . PHP_EOL;
            }
        }
    }
}

Trait

<?php
namespace App\Traits;
trait bladeTrait{
    public function newToXml($data){
        if(is_array($data) && count($data) > 0) {
            $xml = "<xml>";
            foreach ($data as $key=>$val) {
                $xml.="<".$key.">".$val."</".$key.">";
            }
            $xml.="</xml>";
            return $xml;
        }
        return "";
    }

    public function newToUrlParams($data){
        $buff = "";
        foreach ($data as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
朝着梦,踏平坎坷
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!