參考來源:
https://www.php.cn/php-weizijiaocheng-407545.html
https://blog.csdn.net/rain_silently/article/details/79390377
https://blog.csdn.net/chenrui310/article/details/80830798
廢話不多說,直接上代碼:
public function demo() { // 獲取微信回調的數據 $notifiedData = file_get_contents('php://input'); //XML格式轉換 $xmlObj = simplexml_load_string($notifiedData, 'SimpleXMLElement', LIBXML_NOCDATA); $xmlObj = json_decode(json_encode($xmlObj),true); $key = "公眾號的key"; //請求回來的數據格式 // $xmlObj = [ // 'appid' => 'wxf546a8df41c2ce18', // 'attach' => '商品', // 'bank_type' => 'CFT', // 'cash_fee' => '1', // 'fee_type' => 'CNY', // 'is_subscribe' => 'Y', // 'mch_id' => '1534940151', // 'nonce_str' => 'jld6md2ky75emve7spsrf2tolturngrm', // 'openid' => 'oyljP5y2HbOHsEAuOLpHP2dXQChw', // 'out_trade_no' => '20190808164259728748651734197807', // 'result_code' => 'SUCCESS', // 'return_code' => 'SUCCESS', // 'sign' => 'A68DC8C8E61DCA90D4454963982A7B12', // 'time_end' => '20190808164308', // 'total_fee' => '1', // 'trade_type' => 'JSAPI', // 'transaction_id' => '4200000342201908088760422065', // ]; //是否成功支付 if ($xmlObj['return_code'] == "SUCCESS" && $xmlObj['result_code'] == "SUCCESS") { //把簽名去掉 $xmlSign = $xmlObj['sign']; unset($xmlObj['sign']); $sign = $this -> appgetSign($xmlObj,$key); if ($sign === $xmlSign) { //驗證通過,確認已經支付
//告訴微信不用重復通知
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
} } } /* * 格式化參數格式化成url參數 生成簽名sign */ private function appgetSign($Obj,$appwxpay_key) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //簽名步驟一:按字典序排序參數 ksort($Parameters); $String = $this -> ToUrlParams($Parameters); //簽名步驟二:在string后加入KEY if($appwxpay_key){ $String = $String."&key=".$appwxpay_key; } //簽名步驟三:MD5加密 $String = md5($String); //簽名步驟四:所有字符轉為大寫 $result_ = strtoupper($String); return $result_; } private function ToUrlParams($Parameters) { $buff = ""; foreach ($Parameters as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; }