小程序模板網(wǎng)

PHP:微信小程序調(diào)用【統(tǒng)一下單】【微信支付】【支付回調(diào)】API;XML轉(zhuǎn)Array,

發(fā)布時(shí)間:2018-04-20 11:34 所屬欄目:小程序開發(fā)教程

1、微信公眾號(hào)、微信小程序開發(fā)過程中,第三方服務(wù)器與微信服務(wù)器數(shù)據(jù)交互,需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,必須用到這兩個(gè)函數(shù):

分別是xml_to_array、array_to_xml ;

2、拼接參數(shù),將數(shù)組轉(zhuǎn)換成鍵值對(duì)形式的字符串:key=value&k=v

3、微信小程序生成簽名,makeSign($params,$KEY),第一個(gè)參數(shù)是微信官方文檔需要的參數(shù);第二個(gè)參數(shù)是 申請(qǐng)微信支付獲得的KEY

4、微信小程序的簽名,總共需要三次;期中前兩次是必須的,最后一次盡量加上

  4.1 第一次是【統(tǒng)一下單】,將所有需要的信息進(jìn)行生成簽名,包括:

$post['appid'] = $appid;
$post['body'] = $body;
$post['mch_id'] = $mch_id;
$post['nonce_str'] = $nonce_str;//隨機(jī)字符串
$post['notify_url'] = $notify_url;
$post['openid'] = $openid;
$post['out_trade_no'] = $out_trade_no;
$post['spbill_create_ip'] = $spbill_create_ip;//服務(wù)器終端的ip
$post['total_fee'] = intval($total_fee); //總金額 最低為一分錢 必須是整數(shù)
$post['trade_type'] = $trade_type;
$sign = $this->MakeSign($post,$KEY); //簽名

..等等信息;

 4.2 第二次是根據(jù)【統(tǒng)一下單】獲得的"PREPAY_ID",和申請(qǐng)支付獲得的KEY,進(jìn)行makeSign簽名,返回給前端(如JS、APP等)進(jìn)行調(diào)用wx.requestPayment({...})微信支付,包括:

$tmp['appId'] = $appid;
$tmp['nonceStr'] = $nonce_str;
$tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
$tmp['signType'] = 'MD5';
$tmp['timeStamp'] = "$time";

//上面是簽名所需數(shù)據(jù),下面是返回?cái)?shù)據(jù)

$data['timeStamp'] = "$time";

$data['nonceStr'] = $nonce_str;

$data['signType'] = 'MD5';

$data['paySign'] = $this->MakeSign($tmp,$KEY);

$data['package'] = 'prepay_id='.$array['PREPAY_ID'];

($array是【統(tǒng)一下單】返回的數(shù)據(jù),經(jīng)過了xml_to_array處理)

  4.3 第三次是微信將支付結(jié)果通知給商戶,商戶需要進(jìn)行處理通知結(jié)果。(通俗點(diǎn):就是微信告訴你,用戶支付成功,你要給微信回一句話:我知道了。)

這個(gè)時(shí)候也需要makeSing簽名,具體代碼如下:


/* 微信支付完成,回調(diào)地址url方法  xiao_notify_url() */
    public function xiao_notify_url(){
        $KEY = '你申請(qǐng)微信支付的KEY';
        $post = post_data();    //接受POST數(shù)據(jù)
        $post_data = $this->xml_to_array($post);   //微信支付成功,返回回調(diào)地址url的數(shù)據(jù):XML轉(zhuǎn)數(shù)組Array
        $postSign = $post_data['sign'];
        unset($post_data['sign']);    //這里很重要哦,一定要將返回的sign剔除掉
        
        /* 微信官方提醒:
         *  商戶系統(tǒng)對(duì)于支付結(jié)果通知的內(nèi)容一定要做【簽名驗(yàn)證】,
         *  并校驗(yàn)返回的【訂單金額是否與商戶側(cè)的訂單金額】一致,
         *  防止數(shù)據(jù)泄漏導(dǎo)致出現(xiàn)“假通知”,造成資金損失。
        */
        ksort($post_data);// 對(duì)數(shù)據(jù)進(jìn)行排序
        //正常情況微信是不會(huì)返回支付的key的,為保萬一我們判斷一下  --xzz 0622
        if($post_data['key']){
            $str = $this->ToUrlParams($post_data);//對(duì)數(shù)組數(shù)據(jù)拼接成key=value字符串
        }else{
            $str = $this->ToUrlParams($post_data).'&key='.$KEY; //這里也一定要加上key,不然簽名就錯(cuò)了
        }
        $user_sign = strtoupper(md5($str));   //再次生成簽名,與$postSign比較
        
        $where['crsNo'] = $post_data['out_trade_no'];
        $order_msg = M('home_order','xxf_witkey_')->where($where)->find();
        /*
         *  分別判斷返回狀態(tài)碼、返回簽名sign、返回訂單總金額,三者同時(shí)為真,訂單交易成功,狀態(tài)修改為‘ok’
        */
        if($post_data['return_code']=='SUCCESS'&&$postSign==$user_sign&&$order_msg['order_amount']*100==$post_data['total_fee']){
            /*
            * 首先判斷,訂單是否已經(jīng)更新為ok,因?yàn)槲⑿艜?huì)總共發(fā)送8次回調(diào)確認(rèn)
            * 其次,訂單已經(jīng)為ok的,直接返回SUCCESS
            * 最后,訂單沒有為ok的,更新狀態(tài)為ok,返回SUCCESS
            */
            if($order_msg['order_status']=='ok'){
                $this->return_success();
            }else{
                $updata['order_status'] = 'ok';
                if(M('home_order','xxf_witkey_')->where($where)->save($updata)){
                    $this->return_success();
                }
            }
        }else{
            echo '微信支付失敗';
        }
    }
    
    /*
     * 給微信發(fā)送確認(rèn)訂單金額和簽名正確,SUCCESS信息 -xzz0521
     */
    private function return_success(){
        $return['return_code'] = 'SUCCESS';
        $return['return_msg'] = 'OK';
        $xml_post = '
                    '.$return['return_code'].'
                    '.$return['return_msg'].'
                    ';
        echo $xml_post;exit;
    }


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉(cāng)庫:starfork
本文地址:http://22321a.com/wxmini/doc/course/23803.html 復(fù)制鏈接 如需定制請(qǐng)聯(lián)系易優(yōu)客服咨詢:800182392 點(diǎn)擊咨詢
QQ在線咨詢