首頁  >  文章  >  後端開發  >  支付驗證簽名支付失敗? —— 微信支付的app支付

支付驗證簽名支付失敗? —— 微信支付的app支付

ringa_lee
ringa_lee原創
2018-05-14 15:45:105514瀏覽

狀況描述:

1,呼叫同一下單接口,已經取得prepay_id等值了呀!

2,提交資料給app之前,有個二次簽名嘛,我照規則簽了呀! //請大神看看我寫的程式碼是否正確

3,為啥會出現這種問題?

4,跪求大神指導!

這是我二次簽署的程式碼:

............ //設定參數等等

$wx_result = $wechatAppPay->unifiedOrder( $params );//调用同一下单接口,并成功返回结果
 
//开始生成二次签名
$sign_array              = array();//第二次签名需要的参数
$sign_array['appid']     = $wx_result['appid'];
$sign_array['mch_id']    = $wx_result['mch_id'];
$sign_array['prepay_id'] = $wx_result['prepay_id'];
$sign_array['nonce_str'] = $wx_result['nonce_str'];
$sign_array['timeStamp'] = time();
$sign_array['package']   = $wx_result['Sign=WXPay'];
$sign_two = $wechatAppPay->MakeSign($sign_array);//调用签名生成函数

下面是我產生簽名的函數程式碼:

/**
 * 生成签名
 *  @return 签名
 */
public function MakeSign( $params ){
    //签名步骤一:按字典序排序数组参数
    ksort($params);
    $string = $this->ToUrlParams($params);//调用拼接函数
    //签名步骤二:在string后加入KEY
    $string = $string . "&key=".$this->key;
    //签名步骤三:MD5加密
    $string = md5($string);
    //签名步骤四:所有字符转为大写
    $result = strtoupper($string);
    return $result;
}
      /**
     * 将参数拼接为url: key=value&key=value
     * @param   $params
     * @return  string
     */
    public function ToUrlParams( $params ){
        $string = '';
        if( !empty($params) ){
            $array = array();
            foreach( $params as $key => $value ){
                $array[] = $key.'='.$value;
            }
            $string = implode("&",$array);
        }
        return $string;
    }

這個問題已解決,原因是第二次簽章時的參數名稱不對。

/////////////////////////////更新////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////////////////
但是回呼不知帶哦怎麼寫了! !

但收不到值(收不到微信給發的支付結果通用通知),也不知道是怎麼回事

接收微信支付異步通知回調地址:

$notify_url        = 'http://www.XXXXXX.com/index.php/apps/cart/wxResult';
//微信支付回调函数
public function wxResult()
{
    $data = array();
    $data = $this->wechatAppPay->getNotifyData();//调用获取数据函数
    
    ////////********逻辑处理********//////////
    
 $data2 = $this->wechatAppPay->replyNotify();//接收通知成功后应答输出XML数据
 
 
 $this->jsonmsg($data);
 }

獲取通知數據的函數:

/**
 * 
 * 获取支付结果通知数据
 * return array
 */
public function getNotifyData(){
    //获取通知的数据
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    $data = array();
    if( empty($xml) ){
        return false;
    }
    $data = $this->xml_to_data( $xml );
    if( !empty($data['return_code']) ){
        if( $data['return_code'] == 'FAIL' ){
            return false;
        }
    }
    return $data;
}

接收通知成功後應答輸出XML資料函數:

   /**
     * 接收通知成功后应答输出XML数据
     * @param string $xml
     */
    public function replyNotify(){
        $data['return_code'] = 'SUCCESS';
        $data['return_msg'] = 'OK';
        $xml = $this->data_to_xml( $data );
        echo $xml;
        die();
    }

**已解決
///////更新/////////////////商家系統對於付款結果通知的內容做簽名驗證///////////////////////////////**

正在做商家系統對於支付結果通知的內容做簽名驗證,咋驗證?
是啥?邏輯思路是啥?

回覆內容:

付款介面文件

文件中規定的欄位

appid

partnerid

prepayid

不要加底線什麼的。我之前就是遇到這個問題,已經解決了。

你好 我也遇到了相同的問題 不知道你的解決了沒

參數名稱參與md5計算嗎?

二次簽章的時間戳是 產生pre_payid時的時間戳

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn