PHP微信がお年玉を出すヘルプ類WeChatReder.class

11589 ワード

Class、コードはgitのコードに基づいて修正されました.
config = array_merge($this->config, $config);
    }

    public function setParameter($k, $v)
    {
        $this->parameters[$k] = $v;
    }

    public function getParameter($k)
    {
        return $this->parameters[$k];
    }

    public function create_noncestr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
            //$str .= $chars[ mt_rand(0, strlen($chars) - 1) ];
        }
        return $str;
    }

    protected final function check_packet()
    {
        if ($this->parameters["nonce_str"] == null ||
            $this->parameters["mch_billno"] == null ||
            $this->parameters["mch_id"] == null ||
            $this->parameters["wxappid"] == null ||
            $this->parameters["nick_name"] == null ||
            $this->parameters["send_name"] == null ||
            $this->parameters["re_openid"] == null ||
            $this->parameters["total_amount"] == null ||
            $this->parameters["max_value"] == null ||
            $this->parameters["total_num"] == null ||
            $this->parameters["wishing"] == null ||
            $this->parameters["client_ip"] == null ||
            $this->parameters["act_name"] == null ||
            $this->parameters["remark"] == null ||
            $this->parameters["min_value"] == null
        ) {
            return false;
        }
        return true;

    }

    /**
     *   :
     * appid:    wxd930ea5d5a258f4f
     * mch_id:    10000100
     * device_info:  1000
     * Body:    test
     * nonce_str:  ibuaiVcKdpRxkhJA
     *    :      key=value    ,       ASCII        :
     * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
     * d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
     *    :      :
     * stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
     * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A
     * 9CF3B7"
     */
    protected function get_sign()
    {
        if (!isset($this->config['partnerkey']) || $this->check_packet() === false) {
            return false;
        }
        ksort($this->parameters);
        $unSignParaString = $this->formatQueryParaMap($this->parameters, false);
        return $this->sign($unSignParaString, $this->config['partnerkey']);
    }

    private function sign($content, $key)
    {
        $signStr = $content . "&key=" . $key;
        return strtoupper(md5($signStr));
    }

    private function verifySignature($content, $sign, $md5Key)
    {
        $signStr = $content . "&key=" . $md5Key;
        $calculateSign = strtolower(md5($signStr));
        $tenpaySign = strtolower($sign);
        return $calculateSign == $tenpaySign;
    }

    //      XML  
    /*
    
        ![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]
        ![CDATA[0010010404201411170000046545]]
        ![CDATA[888]]
        ![CDATA[wxcbda96de0b165486]]
        ![CDATA[nick_name]]
        ![CDATA[send_name]]
        ![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]
        ![CDATA[200]]
        ![CDATA[200]]
        ![CDATA[200]]
        ![CDATA[1]]
        ![CDATA[    ]]
        ![CDATA[127.0.0.1]]
        ![CDATA[    ]]
        ![CDATA[act_id]]
        ![CDATA[    ]]
        ![CDATA[https://xx/img/wxpaylogo.png]]
        ![CDATA[share_content]]
        ![CDATA[https://xx/img/wxpaylogo.png]]
        ![CDATA[https:/xx/img/wxpaylogo.png]]
        ![CDATA[50780e0cca98c8c8e814883e5caa672e]]
    
    */
    public function create_hongbao_xml($retcode = 0, $reterrmsg = "ok")
    {
        //var_dump($this->parameters);
        //    
        $this->setParameter('sign', $this->get_sign());
        dump($this->parameters);
        return $this->arrayToXml($this->parameters);
    }


    public function sendRedPacket($vars, $ssl = [], $second = 30, $aHeader = [])
    {
        $ch = curl_init();
        //    
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //      ,     
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch, CURLOPT_URL, $this->red_packet_url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        //           
        //     ,cert   key       .pem  
        if (array_key_exists("cert", $ssl) && array_key_exists('key', $ssl) && array_key_exists('rootca', $ssl)) {
            curl_setopt($ch, CURLOPT_SSLCERT, $ssl['cert']);
            curl_setopt($ch, CURLOPT_SSLKEY, $ssl['key']);
            curl_setopt($ch, CURLOPT_CAINFO, $ssl['rootca']);
        }
        if (count($aHeader) >= 1) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }

        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
        $data = curl_exec($ch);
        if ($data) {
            curl_close($ch);
            $responseObj = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
            return $responseObj;
        } else {
            $error = curl_errno($ch);
            //echo "call faild, errorCode:$error
"; curl_close($ch); return false; } } private function genAllUrl($toURL, $paras) { $allUrl = null; if (null == $toURL) { die("toURL is null"); } if (strripos($toURL, "?") == "") { $allUrl = $toURL . "?" . $paras; } else { $allUrl = $toURL . "&" . $paras; } return $allUrl; } private function splitParaStr($src, $token) { $resMap = array(); $items = explode($token, $src); foreach ($items as $item) { $paraAndValue = explode("=", $item); if ($paraAndValue != "") { $resMap[$paraAndValue[0]] = $parameterValue[1]; } } return $resMap; } private function formatQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if (null != $v && "null" != $v && "sign" != $k) { if ($urlencode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } $reqPar = ''; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } private function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { // if (null != $v && "null" != $v && "sign" != $k) { if ($urlencode) { $v = urlencode($v); } $buff .= strtolower($k) . "=" . $v . "&"; //} } $reqPar = ''; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } private function arrayToXml($arr) { $xml = ""; foreach ($arr as $key => $val) { if (is_numeric($val)) { $xml .= "" . $val . "" . $key . ">"; } else $xml .= "" . $key . ">"; } $xml .= ""; return $xml; } }

呼び出し方法require or loadは、私のマルチマイクロ信号管理なので、マッチングコードを自分で修正します.

        $MCHID = "";
        $money = 1 * 100;
        $openid = "";

        $config = ['partnerkey' => '', 'appid' => ''];
        $redHelper = new WeChatReder($config);

        $redHelper->setParameter("nonce_str", $redHelper->create_noncestr());//     ,    32  
        $redHelper->setParameter("mch_billno", OrderHelper::createOrderNo());//   
        $redHelper->setParameter("mch_id", $MCHID);//   
        $redHelper->setParameter("wxappid", $config['appid']);

        $redHelper->setParameter("nick_name", '  ');//     
        $redHelper->setParameter("send_name", '  ');//       
        $redHelper->setParameter("re_openid", $openid);//        openid
        $redHelper->setParameter("total_amount", $money);//    ,   
        $redHelper->setParameter("min_value", $money);//      ,   
        $redHelper->setParameter("max_value", $money);//      ,   
        $redHelper->setParameter("total_num", 1);//       
        $redHelper->setParameter("wishing", '        ,      !');//     
        $redHelper->setParameter("client_ip", '127.0.0.1');//        Ip   
        $redHelper->setParameter("act_name", "test");//    
        $redHelper->setParameter("remark", '             ');//    
//      $redHelper->setParameter("logo_imgurl", RES_DOMAIN.'assets/images/getheadimg.jpg');//  logo url
//      $redHelper->setParameter("share_content", '    [  ]   ');//    
//      $redHelper->setParameter("share_url", RES_DOMAIN);//    
//      $redHelper->setParameter("share_imgurl", RES_DOMAIN.'assets/images/getheadimg.jpg');//     url


        $postXml = $redHelper->create_hongbao_xml();
        $weid = 1;
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
        $ssl['cert'] = SSL_PATH . "{$weid}/apiclient_cert.pem";
        $ssl['key'] = SSL_PATH . "{$weid}/apiclient_key.pem";
        $ssl['rootca'] = SSL_PATH . "{$weid}/rootca.pem";

        if (!file_exists($ssl['key'])) {
            exit("     ");
        }
        $rest = $redHelper->sendRedPacket($postXml, $ssl);
        var_dump($rest);