1. 程式人生 > >微信支付一 :公眾號支付2 notify_url 回撥

微信支付一 :公眾號支付2 notify_url 回撥

/**
     * 該連結是通過【統一下單API】中提交的引數notify_url設定,如果連結無法訪問,商戶將無法接收到微信通知。
     * 通知url必須為直接可訪問的url,不能攜帶引數。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
     * 
     * 支付完成後,微信會把相關支付結果和使用者資訊傳送給商戶,商戶需要接收處理,並返回應答。
     * 對後臺通知互動時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,微信會通過一定的策略定期重新發起通知,儘可能提高通知的成功率,但微信不保證通知最終能成功。
     * (通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)
     * 注意:同樣的通知可能會多次傳送給商戶系統。商戶系統必須能夠正確處理重複的通知。
     * 推薦的做法是,當收到通知進行處理時,首先檢查對應業務資料的狀態,判斷該通知是否已經處理過,如果沒有處理過再進行處理,如果處理過直接返回結果成功。在對業務資料進行狀態檢查和處理之前,要採用資料鎖進行併發控制,以避免函式重入造成的資料混亂。
     * 特別提醒:商戶系統對於支付結果通知的內容一定要做簽名驗證,防止資料洩漏導致出現“假通知”,造成資金損失。
     * 
     * @throws Exception
     * 
     * @throws Exception
     * 
     * @throws Exception
     */
    public String PaySult() throws Exception {


        String resXml = "";
        Map<String, String> backxml = new HashMap<String, String>();


        InputStream inStream;
        try {
            inStream = request.getInputStream();


            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            logger.error("微信支付----付款成功----");
            outSteam.close();
            inStream.close();
            String result = new String(outSteam.toByteArray(), "utf-8");// 獲取微信呼叫我們notify_url的返回資訊
            logger.error("微信支付----result----=" + result);
            Map<Object, Object> map = Xmlunit.xml2map(result, false);


            if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
                logger.error("微信支付----返回成功");
                if (verifyWeixinNotify(map)) {
                    // 訂單處理 操作 orderconroller 的回寫操作?
                    logger.error("微信支付----驗證簽名成功");
                    // backxml.put("return_code", "<![CDATA[SUCCESS]]>");
                    // backxml.put("return_msg", "<![CDATA[OK]]>");
                    // // 告訴微信伺服器,我收到資訊了,不要在呼叫回撥action了
                    // strbackxml = pay.ArrayToXml(backxml);
                    // response.getWriter().write(strbackxml);
                    // logger.error("微信支付 ~~~~~~~~~~~~~~~~執行完畢?backxml=" +
                    // strbackxml);


                    // ====================================================================
                    // 通知微信.非同步確認成功.必寫.不然會一直通知後臺.八次之後就認為交易失敗了.
                    resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
                            + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";


                    // 處理業務 -修改訂單支付狀態
                    logger.error("微信支付回撥:修改的訂單=" + map.get("out_trade_no"));
                    int editres = Wechat_Order.execute("UPDATE wechat_order SET paystatus =? WHERE orderno=?",
                            new Object[] { EnumPayStatus.Paybackok.getValue(), map.get("out_trade_no") });
                    if (editres > 0) {
                        logger.error("微信支付回撥:修改訂單支付狀態成功");
                    } else {
                        logger.error("微信支付回撥:修改訂單支付狀態失敗");
                    }


                }
                // ------------------------------
                // 處理業務完畢
                // ------------------------------
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
                out.write(resXml.getBytes());
                out.flush();
                out.close();
            }
            // else {
            // logger.info("支付失敗,錯誤資訊:" + map.get("err_code"));
            // resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
            // + "<return_msg><![CDATA[報文為空]]></return_msg>" + "</xml> ";
            // }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error("支付回調發布異常:" + e);
            e.printStackTrace();
        }
        return resXml;
    }


    /**
     * 驗證簽名
     * 
     * @param map
     * @return
     */
    public boolean verifyWeixinNotify(Map<Object, Object> map) {
        SortedMap<String, String> parameterMap = new TreeMap<String, String>();
        String sign = (String) map.get("sign");
        for (Object keyValue : map.keySet()) {
            if (!keyValue.toString().equals("sign")) {
                parameterMap.put(keyValue.toString(), map.get(keyValue).toString());
            }
        }
        String createSign = pay.getSign(parameterMap);
        if (createSign.equals(sign)) {
            return true;
        } else {
            logger.error("微信支付  ~~~~~~~~~~~~~~~~驗證簽名失敗");
            return false;
        }


    }

相關推薦

支付 公眾支付3 申請退款

/** * 驗證簽名 * * @param map * @return */ public boolean verifyWeixinNotify(Map<Object, Object> map) {

支付 公眾支付2 notify_url

/** * 該連結是通過【統一下單API】中提交的引數notify_url設定,如果連結無法訪問,商戶將無法接收到微信通知。 * 通知url必須為直接可訪問的url,不能攜帶引數。示例:notify_url:“https://pay.weixin.qq.

統一下單_公眾支付_掃碼支付

微信掃碼支付流程圖:https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=6_5&index=4 微信公眾號支付流程圖:https://pay.weixin.qq.com/wiki/doc/api/

公眾開發

1. 首先查詢公眾號是否存在 https://api.weixin.qq.com/cgi-bin/token? grant_type=client_credential&appid=APPI

一個PHP檔案搞定支付系列之公眾支付

<?php class WxpayService { protected $mchid; protected $appid; protected $appKey; protected $apiKey; public $data = null; publi

支付之JSAPI公眾支付

前提 本教程預設以下幾點你已經完全滿足: 開通了認證後的服務號 服務號開通的微信支付的認證 騰訊給你的郵件中有商戶登入的賬號和密碼 擁有一個可供上傳程式碼和設定回撥域名的網站或雲服務 有一點點php知識。 第一步:公眾號設定 1、 你的公眾號,在支付認證的標籤下, 內容應該和下圖類似。證明公眾號已

Java支付開發之公眾支付內H5調起支付

官方文件準備工作:已通過微信認證的公眾號,必須通過ICP備案域名(否則會報支付失敗)借鑑了很多大神的文章,在此先謝過了整個支付流程,看懂就很好寫了一、設定支付目錄在微信公眾平臺設定您的公眾號支付支付目錄,設定路徑見下圖。公眾號支付在請求支付的時候會校驗請求來源是否有在公眾平臺

H5頁面返回公眾

安卓 返回 itl http 微信h5 fun 物理 公眾 log 如果想在某個頁面直接返回公眾號,但是通過安卓物理按鈕,直接點擊返回,會陷入死循環。pushHistory();if (typeof window.addEventListener != "unde

【虛擬走路】運動刷步公眾更新了再用什麽刷步數

tro 微信 每天 搜索 需求 HR strong ron jsb 大家都知道微信運動可以記錄我們每天的步行數據,但是我們想知道這個數據能否通過技術手段進行作弊呢? 之前我們知道有一個黑科技公眾號【虛擬走路】,可以對微信運動數據進行輕松修改。 但是後來因為種種原因這個公眾號

小程式和公眾區別

小程式和公眾號都是微信的產品;小程式自上市以來一直都是很火爆,但是他和微信公眾號有什麼區別呢?很多人都不清楚這兩者之間有什麼區別,在這裡,小程式開發公司城市網站聯盟(www.cswz.cn)給你分享下小程式和微信公眾號有什麼區別: 公眾號是內容媒體和O2O生活服務的資訊化平臺;小程式是一種

跳轉,網頁跳轉app跳轉公眾關注頁面[轉載]

【微信跳轉連結】之跳轉公眾號關注頁面如何做到在微信內部在這裡插入程式碼片瀏覽器開啟的webview頁面中,跳轉到微信公眾號的關注頁面呢!我們可以通過訪問微信提供的URL協議(weixin://)來實現這個功能!起始不少人已經關注到了招行的智慧微信客服:http://xyk.cmbchina.com/Latte

JAVA版機器人(非公眾)【L】

JAVA微信機器人(一) 我這是強調,我做的是個人聊天微信機器人,非公眾號。就是你和你朋友聊天時用的微信。以下是微信機器人和我朋友的聊天記錄。 首先,微信並沒有給我們提供任何介面,或者功能去開發微信機器人。那麼我們唯一的渠道就是用WEB微信,模擬瀏覽器,獲取聊天記錄,然後

第三方登陸,公眾的開發之連線伺服器(接入指南)

接到微信第三方登陸的開發後,找了我能找的資源,包括網上的資源,對微信第三方登陸有所瞭解,本文僅限於測試開發在公司的微信認證沒有申請下來,可以做的demo試試,也是第一步按步驟走1.你想跟微信合作,呼叫微信的介面,你和他是不是得保證能連起來呢?所以第一步就是想辦法連起來,即接入

解析!如何從手機網站直接跳轉到新增好友OR公眾關注介面

第三方瀏覽器開啟微信的介面,微信只給部分合作平臺開放了介面許可權,任何第三方想呼叫只能是通過一些技術手段來請求介面,獲取祕鑰(ti

公眾支付)統一下單

最近在研究微信公眾號的支付開發,一開始對著開發文件各種懵,也自然而然地跳入了各種坑,現在把整個開發過程簡略地做個記錄。 1.開發環境準備 首先要有一個微信服務號,訂閱號是不能開通微信支付的。微信公眾號申請微信支付後,接著申請微信支付商戶平臺,公眾號上面已經標明“公眾平臺微信支付公眾號支付授權

公眾支付 支付 小程式支付 h5支付開發連載(二)h5頁面提交訂單

上一節給大家分享了使用者授權公眾號獲取使用者openid的詳細教程,本節給大家繼續分享使用者進入公眾號的h5網頁提交訂單的實現過程 上節教程獲取到使用者openid後,把這個引數返回到h5頁面,用隱藏域接收後再連同這個openid以及訂單所有資訊提交後臺介面,這裡以最關鍵的訂單資訊:金額為例

公眾支付、獲取openId)

微信開發文件簡直一神坑,網上也沒幾個跑的通的流程,講解也沒看見有幾個詳細的,所以決定整理一下微信公眾號支付,關於微信的其他支付例如掃碼和非微信內建瀏覽器H5支付這些,有時間的話會陸續更新,關於微信支付這邊有沒看懂的也可以騷擾QQ:1329538287 一、流程: 1.  已

公眾支付支付驗證簽名失敗

如果開發的時候用微信demo做開發的話記得注意 wxpay這個類的建構函式中, if (useSandbox) { this.signType = SignType.MD5; // 沙箱環境 } else { this

公眾支付JSAPI,提示2支付缺少引數appId

因為demo中支付金額是定死的,所以需要調整。 所以在使用的JS上添加了引數傳入。這裡的傳入string型別的引數,直接使用是錯誤的,對於方法,會出現appid缺少引數的錯誤 //呼叫微信JS api 支付 function jsApiCall(jsStr

公眾支付提示呼叫JSAPI缺少引數timeStamp的解決方案

       在除錯微信公眾號支付時遇到了一個比較詭異的問題,在安卓手機上完全正常,但是同樣的程式碼在蘋果裝置上就不行,iphone和ipad都測試過也是報同樣的錯誤呼叫JSAPI缺少引數:timeStamp。開始列印了一下資料發現生成的json資料中是有時間戳這個引數的,但