微信支付的使用介紹

本文是自己做微信支付的一點心得,對於想做微信支付的開發者應該有些許幫助,有寫的不對的地方還請見諒。

與微信建立連接

    在日常使用微信的過程中,或多或少會接觸到一些在微信公衆號裏付錢的操作,比如手機充錢,京東微信商城購物等。當點擊公衆號下面菜單的鏈接跳轉到網上商城時,我們發現其實鏈接到的是商家自己的h5網站,賣什麼東西怎麼賣是商家自己進行維護(微信提供了網站的入口與便捷的支付功能)。那麼怎麼才能實現公衆號與h5網站的連接呢?

         對於動手黨來說,肯定是想立馬建立一個屬於自己公衆號看看效果,那麼你可以先看這篇文章(不包含微信支付),如果實現文章裏面的那些案例沒有問題,那麼可以跳過這部分了。http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

如果有些朋友暫時還不想一下子深入進去,可以接着往下看,下面的內容在上面的文章中大部分都有提及。要實現一個簡單的公衆號與h5網站的連接大概需要包含以下幾個部分。
1.一個公衆號
 在微信官方網站(https://mp.weixin.qq.com/)上可以進行申請,個人目前可以申請訂閱號(沒有支付與自定義菜單等高級權限),但是已經可以滿足這裏與h5網站連接的需要了。如果是企業用戶,有支付需求的話,可以申請一個服務號認證後就可以有支付權限了;當然與此配套的還需要申請一個商戶號,用以綁定銀行卡。
2.一個可以在外網訪問的h5網站
 因爲是要供微信調用的,所以網站必須在外網能夠進行訪問,如果自己沒有服務器,那麼可以使用免費的新浪雲(支持MySql數據庫),將自己的網站掛在上面。
最重要的就是這個網站的默認頁,因爲微信發過來的消息全部會到網站的默認頁上,在此頁面裏需要對微信消息進行相應的處理。
3.建立連接
 在有了公衆號與h5網站的基礎上,就可以進行這一步了。
(1)在微信開發->基本配置裏面進行如下設置。
URL:h5網站地址,微信會把消息發送到這個網站上
TOKEN:這是個密鑰,每次與微信交互信息時需要進行驗證
(2)網站默認頁
這個頁面負責接受微信消息,驗證訪問正確性,返回消息給微信。下面使用php代碼來說明下怎麼做。
    /**
     * 驗證訪問正確性
     */
    private function CheckSignature() {
        //微信調用帶過來的3個參數
        $signature = $_GET["signature"]; //加密的字符串
        $timestamp = $_GET["timestamp"]; //時間戳
        $nonce = $_GET["nonce"]; //隨機字符串
        $echostr = $_GET["echostr"]; //如果是在公衆號裏設置調用url時,會有個參數
        //將$token,$timestamp,$nonce拼接在一起使用sha1加密
        $token = TOKEN; //這個是設置的密鑰
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        //如果加密出來的信息與微信過來的信息一致則進行後續處理
        if ($tmpStr == $signature) {
            //如果是設置調用url,則原樣返回echostr即可
            if ($echostr) {
                echo $echostr;
                exit(0);
            }
            //如果是用戶與公衆號正常互動,繼續處理
            $this->DelMsg();
        } else {
            exit(0);
        }
    }
在驗證了訪問的正確性後,就可以解析微信post過來的參數了,根據不同的消息類別可以進行不同的回覆,下面以文本消息來實現一個回覆與用戶發送相同信息的例子。
首先來看微信post過來的參數說明,更多消息類型請看這裏http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html。

/**
     * 根據信息類型處理信息
     */
    private function DelMsg() {
        //微信post過來的參數
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)) {
            //將格式化的xml字符串轉化成對象
            self::$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        }
        //判斷對象是否解析成功
        if (is_object(self::$postObj)) {
            //MsgType爲消息的類型
            //更多類型查看http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
            $msgType = trim(self::$postObj->MsgType);
            switch ($msgType) {
                case "text":
                    $content = self::$postObj->Content;
                    break;
                default:
                    $content = '';
                    break;
            }
            echo $this->transmitText(self::$postObj, $content);
        } else {
            echo '';
            exit(0);
        }
    }

    /**
     * 回覆文本消息
     * @param type $object 微信post對象
     * @param type $content 文本消息 
     * @return type
     */
    private function transmitText($object, $content) {
        //回覆消息的模板
        //更多模板查看http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html
        $xmlTpl = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[text]]></MsgType>
                    <Content><![CDATA[%s]]></Content>
                   </xml>";
        $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

如果上面處理的沒錯的話,那麼就可以看到如下的效果了:發送了【今天天氣真好】微信回覆了【今天天氣真好】

到這裏爲止與微信的一個簡單連接就建立好了,還有很多有意思的交互,可以自己參考微信的開發文檔自己發掘。

公衆號支付

微信官方文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
公衆號支付,大概功能是微信用戶在商家的h5網站上選購商品,通過微信進行付款,商家最後發貨的過程。下面分幾個部分做說明,詳細的
可參見微信文檔。
1.商品選購
微信用戶可以通過掃碼或者公衆號內消息進入商戶的h5網站,在網站上選購自己所需要的物品,如家電或者手機充值等。
2.生成商家訂單
用戶選擇好需要購買的商品後,就可以在商戶h5網站進行下單,下單後商戶系統需要生成一個訂單,包含訂單號(訂單號需要唯一)與訂單的金額等。
3.生成微信訂單
上面2個步驟主要是在商戶系統進行處理的,這一步需要將商戶的訂單轉成對應的微信訂單,好通過微信支付付錢。
這裏需要調用微信的統一下單接口(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1),將需要的參數傳進去,必要參數如下。
appid:公衆號ID,可以在【基本配置】裏看到
mch_id:微信支付商戶號ID,可以在【微信支付-商戶信息】裏看到
nonce_str:32位長度的隨機字符串
body:商品或者支付訂單的簡要描述
out_trade_no:商戶系統內部的訂單號,需要唯一
fee_type:付費的類型,正常使用人民幣【CNY】
total_fee:訂單的金額,單位爲分
spbill_create_ip:用戶端IP
time_start:交易開始時間
time_expire:交易結束時間,需要超過交易開始時間至少5分鐘
notify_url:微信支付異步通知回調地址,通知url必須爲直接可訪問的url,不能攜帶參數
trade_type:公衆號支付使用【JSAPI】
open_id:這個是用戶的微信號,可以通過接口進行獲取,詳細看這裏http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
sign:將上面的信息合併起來再加上商戶支付密鑰進行一個md5編碼,詳細看這裏https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
將上面的參數傳遞給下單接口,如果沒問題的話,可以從微信那裏得到
prepay_id:微信的預支付ID
4.微信支付
在有了上面獲取到的prepay_id後,這裏可以調用微信的JSAPI接口,讓用戶可以在微信上進行付款了。
<span style="white-space:pre">	</span>//調用微信JSApi支付
        function WeiXinPay(data) {
            WeixinJSBridge.invoke(
                    'getBrandWCPayRequest', {
                        "appId": "wx2421b1c4370ec43b", //公衆號ID,可以在【基本配置】裏看到     
                        "timeStamp": " 1395712654", //時間戳,time()     
                        "nonceStr": "e61463f8efa94090b1f366cccfbbb444", //32位隨機串     
                        "package": "prepay_id=u802345jgfjsdfgsdg888",//上面步驟獲取到的預支付ID
                        "signType": "MD5", //微信簽名方式:     
                        "paySign": "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名,同統一下單簽名規則 
                    },
            function(res) {
                WeixinJSBridge.log(res.err_msg);
                //如果付款成功的話
                if (res.err_msg == 'get_brand_wcpay_request:ok') {
                    hideorshow('paysuccess');
                    $('title').text('支付成功');
                }
            }
            );
        }
5.付款驗證
如果在上一個步驟用戶成功付款的話,可以得到微信前端返回的支付成功消息,這個時候可以在h5頁面提示用戶付款成功。但是【get_brand_wcpay_request:ok】不一定
絕對可靠,這時還需要用上在統一下單時,傳遞給微信的回調url。
微信會異步調用這個回調url,並傳遞進來transaction_id(同prepay_id),在回調頁面裏面,可以調用微信的查詢訂單接口
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2,來查詢訂單的實際狀態,用於確認後續的業務流程怎麼處理。
查詢訂單接口需要的參數如下:
appid:公衆號ID
mch_id:商戶號ID
transaction_id:微信訂單號,與product_id任意一個即可
product_id:商戶訂單號,與transaction_id任意一個即可
nonce_str:32位隨機字符串
sign:微信簽名,同統一下單簽名規則

如果從接口返回過來參數中的return_code與result_code都爲SUCCESS的話,則代表支付成功了。如果支付成功的話,微信還會返回過來其他一些有用的信息,
比如【is_subscride-用戶是否關注公衆號,值爲Y或者N】,對於關注的微信用戶,可以在公衆號裏給用戶推送一條付款成功的消息。
6.商家發貨
在驗證了用戶已經付款的情況下,就可以將用戶購買的商品快遞給用戶了,或者爲用戶指定的手機號充值等。

掃碼支付

有些情況下,可能不需要用戶進入到公衆號裏面選購商品,而是已經存在訂單,只需要用戶直接付款就行了。比如自動售貨機,金額已經固定的合同等。
微信掃碼支付文檔:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
這裏以模式一作爲案例,實現掃碼支付,大致需要以下幾步。
1.掃碼回調url
如果需要使用掃碼支付的話,需要在公衆號裏面設置掃碼回調URL,用於微信掃碼後,將參數傳遞進來,商戶進行相關驗證後,返回給微信支付參數,
類似於公衆號支付中,調用JSAPI支付的那段參數。
在微信支付->掃碼支付->支付回調url處設置
2.一個二維碼
這個二維碼的內容爲一個鏈接,
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
appid:公衆號ID
mch_id:商戶號ID
product_id:商戶系統的訂單號
time_stamp:時間戳
nonce_str:32位隨機字符串
sign:微信簽名,同統一下單簽名規則
3.用戶掃碼支付
如果上一步的二維碼生成正確的話,在使用微信裏的掃一掃功能掃碼後,微信會將上述鏈接中的product_id回傳給設置的回調url中。
在回調頁面裏面,商戶可以驗證該訂單號的正確性或者是否已經支付過了。如果訂單號是有效的,則可以從商戶系統裏面查詢需要的信息進行下單。
這裏還可以不依靠上面的product_id(只是爲了生成二維碼造的假的),在下單時用別的訂單號代替,比如一個guid,可用於事先沒有訂單號的支付。
(1)生成微信訂單
調用微信的統一下單接口實現,同公衆號支付裏面的【3.生成微信訂單】,主要是爲了得到prepay_id。
(2)微信支付
這裏直接將參數轉成xml格式,返回就行,參數如下。
appid:公衆號ID
mch_id:商戶號ID
nonce_str:32位隨機字符串
prepay_id:預支付ID,如果下單錯誤,或者商戶校驗訂單號有問題,這個值可以爲空
result_code:如果下單正確爲【SUCCESS】,如果下單錯誤或者商戶校驗訂單號有問題,爲【FAIL】
err_code_des:如果有錯誤,則爲錯誤信息,否則爲空即可
sign:微信簽名,同統一下單簽名規則
4.付款驗證
微信用戶如果成功付款的話,也會回調在下單時設置的回調URL。具體邏輯同公衆號支付裏面的【5.付款驗證】
5.商家發貨
在驗證了用戶已經付款的情況下,就可以給用戶商品或者給用戶某些應用重置等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章