微信支付-支付验收指引里的【验收签名】如何获取?

发布于 2022-09-07 04:33:56 字数 1858 浏览 20 评论 0

最近在做App的微信支付的验收,请问验收的签名,是需要单独写一端代码来获取然后在整个验收期间都不变,还是需要在支付验收环节里每次都动态获取,直到验收完成,再换成自己的原来的API密钥???这里实在不明白,网上搜了好久也没有相关信息。

我自己写了个小的程序用curl来模拟post行为,始终获取失败

<?php

    $xml = '<xml><appid>开放平台的AppID</appid><mch_id>商户号</mch_id><nonce_str>32位随机数</nonce_str><sign>微信支付API的密钥</sign></xml>';
    $url = 'https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey';
    $header[] = "Content-type: text/xml;charset=UTF-8";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

    $a = curl_exec($ch);
    echo $a;

    curl_close($ch);  
    
?>

获取的始终是:

<xml>
  <return_code><!--[CDATA[FAIL]]--></return_code>
  <return_msg><!--[CDATA[获取沙箱密钥失败,确认交易密钥是否正确]]--></return_msg>
</xml>

以下是官网的资料:

https://pay.weixin.qq.com/wik... 这里看到了获取的说明,但是没说是怎么获取???

获取验签秘钥API:
请求Url https://api.mch.weixin.qq.com...
是否需要证书 否
请求方式 POST

请求参数:
字段名 字段 必填 示例值 类型 说明
商户号 mch_id 是 1305638280 String(32) 微信支付分配的微信商户号
随机字符串 nonce_str 是 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 随机字符串,不长于32位
签名 sign 是 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 签名值


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔少女心 2022-09-14 04:33:56

网上查了好多帖子,终于搞定了,以飨后来者~
PS.如果确认自己各项参数都对,但是还是提示签名错误,更新一下API密钥,然后就ok了,微信那边好像有缓存

创建一个沙箱验收的类,扩展自WxPayDataBase

class Sandbox extends WxPayDataBase{

    //设置对象的属性
    public function s_setValues($k, $v){
        $this->values[$k] = $v;
    }

    //读取对象的属性
    public function s_getValues($k){
        return $this->values[$k];
    }
    
    //获取密钥API
    public static function getSignKey($input, $mch_key){

        console_log( '1:'.json_encode($input->values) );
        
        //提交业务
        $url = 'https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey';
        
        //生成签名
        $input->setSign($mch_key);
        console_log( '2:'.json_encode($input->values) );
        
        //$values = $input->GetValues();
        //console_log( '3:'.json_encode($values) );
        
        $xml = $input->array2xml();
        console_log( '4:'.$xml );

        //向微信请求接口
        $result = self::postXmlCurl($xml, $url);
        console_log( json_encode($result) );

        $result = $input->xml2array($result);
        console_log( json_encode($result) );

        return $result;
    }

    

    /**
     * 
     * 产生随机字符串,不长于32位
     * @param int $length
     * @return 产生的随机字符串
     */
    public static function getNonceStr($length = 32) 
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  {  
            $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
        } 
        return $str;
    }


    /**
     * 以post方式提交xml到对应的接口url
     * 
     * @param string $xml  需要post的xml数据
     * @param string $url  url
     * @param bool $useCert 是否需要证书,默认不需要
     * @param int $second   url执行超时时间,默认30s
     * @throws WxPayException
     */
    private static function postXmlCurl($xml, $url, $useCert = false, $second = 30)
    {    
        $ch = curl_init();
        
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);

        //设置访问的网址
        curl_setopt($ch, CURLOPT_URL, $url);
        
        //skysowe_modifid
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        console_log( 'cert:'.$useCert );
        if($useCert == true){
            //设置证书
            //使用证书:cert 与 key 分别属于两个.pem文件
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);
        }
        
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //console_log( 'xml:'.json_encode($xml) );

        //运行curl
        $data = curl_exec($ch);
        //console_log( 'curl_result:'.json_encode($data) );
        
        //返回结果
        if($data){
            curl_close($ch);
            return $data;
        } else { 
            $error = curl_errno($ch);
            curl_close($ch);
            throw new WxPayException("curl出错,错误码:$error");
            //console_log( 'curl_error:'.$error );
        }
    }


    /**
     * 输出xml字符
     * @throws WxPayException
    **/
    public function array2xml()
    {
        if(!is_array($this->values) 
            || count($this->values) <= 0)
        {
            throw new WxPayException("数组数据异常!");
        }
        
        $xml = "<xml>";
        foreach ($this->values as $key=>$val)
        {
            if (is_numeric($val) || $key=="nonce_str" || $key=="sign" ){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml; 
    }

    /**
     * 将xml转为array
     * @param string $xml
     * @throws WxPayException
     */
    public function xml2array($xml)
    {    
        if(!$xml){
            throw new WxPayException("xml数据异常!");
        }
        //将XML转为array
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);        
        return $this->values;
    }

}

然后获取sandbox_signkey

    //沙箱用例:0 获取验签秘钥
    $sandbox_test = new Sandbox();

    $sandbox_test->s_setValues('mch_id', WxPayConfig::MCHID);
    $sandbox_test->s_setValues('nonce_str', $sandbox_test->getNonceStr());

    //debug
    console_log( $sandbox_test->s_getValues('mch_id') );
    console_log( $sandbox_test->s_getValues('nonce_str') );
    console_log( WxPayConfig::KEY );

    $rs = Sandbox::getSignKey($sandbox_test, WxPayConfig::KEY);

    //debug
    echo json_encode($rs);
    echo $rs['sandbox_signkey'];

    exit;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文