상황 설명:
1. 동일한 주문 인터페이스를 호출하여 prepay_id에 해당하는 값을 얻었습니다!
2. 앱에 데이터를 제출하기 전에 규칙에 따라 2차 서명을 합니다! //내가 작성한 코드가 맞는지 확인해주세요
3. 왜 이런 문제가 발생하나요?
4. 무릎을 꿇고 하나님께 인도를 구하세요!
제 2차 서명 코드는 다음과 같습니다.
........ //매개변수 등 설정
$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; }
두 번째 서명의 매개변수 이름이 잘못되어 이 문제가 해결되었습니다.
/////////////////////////////업데이트///////////// /////////////////////////////////////////////// ///// //////////////////////////////////////////// //////// ////////////////////////////////////
하지만 난 그렇지 않아요 콜백을 작성하는 방법을 모르겠습니다! !
값을 받을 수 없고(위챗에서 결제 결과에 대한 일반 알림을 받을 수 없음), 무슨 일이 일어나고 있는지 모르겠습니다
비동기 알림 콜백 받기 WeChat 결제 주소:
$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
package
noncestr
timestamp
sign
매개변수 이름의 대소문자를 변경하거나 밑줄 등을 추가하지 마세요. 이전에 이 문제가 발생했는데 해결되었습니다.
안녕하세요, 저도 같은 문제를 겪었는데요. 해결하셨는지 궁금합니다.
md5 계산에 매개변수 이름이 포함되나요?
보조 서명의 타임스탬프는 pre_payid가 생성된 타임스탬프입니다