1. 程式人生 > >PHP微信APP支付,下單,處理非同步回撥

PHP微信APP支付,下單,處理非同步回撥

1.下單

  • 其中陣列轉換xml格式,curl傳送請求,xml格式轉換成陣列可單獨封裝成函式。
    public function index() {
        $order = [
            'appid'=>'123456',
            'mch_id'=>'56789',
            'nonce_str'=>uniqid(md5(time())),
            'body'=>'測試商品',
            'out_trade_no'=>87654321,//商戶唯一訂單號,可包含字母序
'total_fee'=>100,//訂單金額,單位/分 'spbill_create_ip'=>'123.12.12.123',//產生訂單號的伺服器IP 'notify_url'=>'http://www.yoursite.com/wxpay',//接受微信非同步通知地址 'trade_type'=>'APP' ]; //使用者http_build_query()將資料轉成URL鍵值對形式 $sign = http_build_query($order
); //$sign = "appid=123456&mch_id=56789&nonce_str=c6079b98e6aeb4a98f687800c887f6cc58df95d72cd69&body=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&out_trade_no=87654321&total_fee=100&spbill_create_ip=123.12.12.123¬ify_url=http%3A%2F%2Fwww.yoursite.com%2Fwxpay&trade_type=APP"; //MD5處理,預設支援MD5
$sign = md5($sign); //轉大寫 $sign = strtoupper($sign); $order['sign'] = $sign; //轉換成一維XML格式 $xml = '<xml>'; foreach($order as $k=>$v){ $xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>'; } $xml.='</xml>'; //CURL會話 $ch = curl_init(); // 設定curl允許執行的最長秒數 curl_setopt($ch, CURLOPT_TIMEOUT, 3); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); // 獲取的資訊以檔案流的形式返回,而不是直接輸出。 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //傳送一個常規的POST請求。 curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder'); //要傳送的所有資料 curl_setopt($ch, CURLOPT_POSTFIELDS, $order); // 執行操作 $response = curl_exec($ch); //將xml格式的$response 轉成陣列 $response = json_decode( json_encode( simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA) ), true ); //若預下單成功,return_code 和result_code為SUCCESS。 if ( $response['return_code'] ==='SUCCESS' && $response['result_code'] ==='SUCCESS') { //返回trade_type和prepay_id供前端呼叫 echo json_encode( ['trade_type'=>$response['trade_type'], 'prepay_id'=>$response['prepay_id']] ); } }

2.處理微信回撥

    public function notify()
    {
        $xml = file_get_contents('php://input');
        $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

        //使用者http_build_query()將資料轉成URL鍵值對形式
        $sign = http_build_query($arr);
        //md5處理
        $sign = md5($sign);
        //轉大寫
        $sign = strtoupper($sign);
        //驗簽名。預設支援MD5
        if ( $sign === $arr['sign']) {
//            校驗返回的訂單金額是否與商戶側的訂單金額一致。修改訂單表中的支付狀態。
        }
        $return = ['return_code'=>'SUCCESS','return_msg'=>'OK'];
        $xml = '<xml>';
        foreach($return as $k=>$v){
            $xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>';
        }
        $xml.='</xml>';

        echo $xml;

    }