天天看點

掃碼點菜系列解讀(二)

對接準備(以測試門店和測試服務為例) 

1、  應用(如果還沒有自己的應用,可見建立應用:[url]https://openclub.alipay.com/read.php?tid=1606&fid=25[/url]) 

(1)如果是商戶自己開發,需要添加口碑碼戰略、當面付功能,當面付需要簽約,有BD請聯系BD簽約,如若沒有BD,并且不清楚如何簽約,可參考:[url]https://openclub.alipay.com/read.php?tid=276&fid=72[/url] 

(2)如果是ISV代商戶開發,需要ISV在自己的應用添加口碑碼戰略、第三方應用授權功能,商戶簽約當面付産品,商戶第三方應用授權給ISV,建議ISV在回流資料的時候傳入APP_auth_token參數,建立支付訂單的時候必須傳遞APP_auth_token參數 

注:我們強烈建議回流資料和APPID和建立支付訂單的APPID是同一個,如若不是,請務必保證回流資料的APPID和建立支付訂單的APPID同屬一個PID 

2、  測試服務(內建階段建議使用測試服務,可參考測試服務建立辦法:[url]https://openclub.alipay.com/read.php?tid=3988&fid=72[/url]) 

3、  測試門店(內建階段建議使用測試門店,可參考測試門店建立辦法:[url]https://openclub.alipay.com/read.php?tid=4013&fid=71[/url]) ,測試門店預設有顯示服務card的能力,正式門店需要掃碼點菜驗收通過後才露出顯示服務card的能力 

4、 測試門店訂購并上架測試服務,上架測試服務之後,使用者掃該門店的桌碼或者門店碼會跳轉到門店服務card的歡迎頁,底部插件區有“點餐”按鈕,如圖: 

5、  點選服務card上面的“開始點菜”按鈕或者插件區的“點餐”按鈕會跳轉測試服務的使用者通路位址上面。(如果不清楚使用者通路位址,請回到第2步) 

6、  使用者在點菜頁面點菜下單之後,需要回流資料 

(1) 回流11狀态(使用者下單、等待商家确認)資料,代碼demo: 

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",            AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json","GBK",AlipayConfig.alipay_public_key,"RSA2");          AlipayOfflineProviderUseractionRecordRequest request = new AlipayOfflineProviderUseractionRecordRequest();    //request.putOtherTextParam("app_auth_token","201801BB6b27c190986b4dac9e85e66d5aec7X35");第三方應用授權    request.setBizContent("{" +    //內建階段傳遞此參數,傳遞之後,在支付寶錢包-口碑tab-我-我的訂單-服務訂單中顯示一條資料,正式環境預設有顯示服務訂單的能力,不用傳遞此參數    "\"is_test_user\":\"1\","+      "\"source\":\"alipay.com\"," +    "\"action_type\":\"order_dishes\"," +    "\"industry\":\"REPAST\"," +    "\"order_type\":\"order_dish\"," +//掃碼點菜場景此參數必填,傳遞order_dish參數标志這是一筆掃碼點菜的資料    "\"user_id\":\"2088712969xxxxxx\","+//user_id以2088開頭,建議傳遞,此參數會影響服務card的實時重新整理,可通過使用者資訊授權接口擷取    "\"date_time\":\"2018-01-26 14:24:30\"," +      "\"action_detail\":{"+    "\"totalPrice\":\"11\","+ //總價,這裡需要注意的是機關分    "\"discountPrice\":\"11\","+ //優惠金額,這裡需要注意的是機關分    "\"realPrice\":\"11\","+ //實際支付,這裡需要注意的是機關分    //從第三方平台進入開發者應用,後産生的資料,傳入第三方平台域名,字段内容不做強制校驗。    //比如目前資料是支付寶掃碼後産生,傳入支付寶域名alipay.com;微信傳入微信域名weixin.qq.com;口碑傳入口碑域名koubei.com;如果資料不是從第三方平台進入後産生的資料,設定自己的域名即可    "\"source\":\"alipay.com\","+    "\"status\":\"11\","+ //11 使用者下單、等待商家确認    "\"outOrderId\":\"20180126145930111\","+ //外部訂單号,這裡需要注意的是,從使用者下單,商家确認,待支付,支付完成,是一筆訂單    "\"tableCode\":\"A05\","+ //桌号,此參數必填,該參數會影響該餐台的card更新    "\"people\":\"2\","+//消費人數,建議傳遞    //detailUrl參數必傳,直接影響到支付寶錢包-口碑tab-我-我的訂單-服務訂單,點選一條資料後跳轉的連結。此參數傳遞要求詳見文檔    "\"detailUrl\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\","+    /*需要注意的是price參數的機關是分!!!*/    "\"dish\":[{\"goodsId\":\"216137\",\"price\":2,\"num\":1,\"goodsName\":\"醬爆茄子\"}],"+//菜品清單,需要注意的price參數是機關分    "\"statusDesc\":\"待商家确認\","+//狀态文案說明,會影響card左上角的文案。請準确描述目前的狀态    //行動點對象清單,每次更新全量覆寫,此參數會直接影響服務card上面的按鈕顯示。請準确描述目前的狀态    //String name ; 行動名稱(比如,去買單、加菜,檢視詳情,再來一單)    //String actionUrl 跳轉URL,建議ISV自行對該url進行加簽驗簽,以避免被惡意程式攔截篡改    //String type URL類型(官方常量 addDish(加菜) pay (去買單),官方會根據類型做業務邏輯,如果不在官方說明,請設定為空)    "\"actionUrlList\":[{\"name\":\"檢視詳情\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"\"},"    + "{\"name\":\"加菜\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"pay\"}],"+    //與目前訂單有關系的使用者,傳入json數組,此參數建議傳遞,也會直接影響到服務card的實時重新整理    //如果不是支付寶使用者不需要傳入,如果order_channel是alipay,強制校驗,必須要傳入    //userId (支付寶使用者ID)    //type (使用者ID行為類型),type 可以選擇設定字元串value:pay,pushOrder,normal    //type各value值含義說明:    //pay:支付者    //pushOrder:下單的使用者    //normal:普通使用者,沒有做特殊說明的都是普通使用者    "\"realtionUserList\":[{\"userId\":\"2088712969xxxxxx\",\"type\":\"pushOrder\"}]"+    "}," +    //店鋪關聯關系。标記目前接口涉及到的店鋪資訊,同時如果傳入的資料在口碑不存在,口碑會建立一條shop_id+outer_id+type的關聯資料    //傳遞之後,請不要再修改此參數    "\"outer_shop_do\":{"+    "\"shop_id\":\"20170803000770000000xxxxxxxx\","+//門店id    "\"outer_id\":\"123456\","+//ISV系統中與口碑店鋪shop_id關聯的ISV店鋪主鍵    "\"type\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\""+//建議直接傳入ISV的域名    "},"+          "\"entity\":\"user\"," +    "\"action_outer_id\":\"20180126145930111\"," +//每次請求的唯一id,需開發者自行保證此參數值每次請求的唯一性    "\"order_channel\":\"isv\"" +//該字段建議填寫。值定義:alipay、weixin、other、isv                  "}");      AlipayOfflineProviderUseractionRecordResponse response;    try {        response = alipayClient.execute(request);          if (response.isSuccess()) {            System.out.println("調用成功" + response.getBody());        } else {            System.out.println("調用失敗" + response.getBody());        }      } catch (AlipayApiException e) {        e.printStackTrace();    }finally {              }    }           

(2)回流13狀态(待支付)資料,代碼demo: 

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",            AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json","GBK",AlipayConfig.alipay_public_key,"RSA2");          AlipayOfflineProviderUseractionRecordRequest request = new AlipayOfflineProviderUseractionRecordRequest();    //request.putOtherTextParam("app_auth_token","201801BB6b27c190986b4dac9e85e66d5aec7X35");第三方應用授權    request.setBizContent("{" +    //內建階段傳遞此參數,傳遞之後,在支付寶錢包-口碑tab-我-我的訂單-服務訂單中顯示一條資料,正式環境預設有顯示服務訂單的能力,不用傳遞此參數    "\"is_test_user\":\"1\","+      "\"source\":\"alipay.com\"," +    "\"action_type\":\"order_dishes\"," +    "\"industry\":\"REPAST\"," +    "\"order_type\":\"order_dish\"," +//掃碼點菜場景此參數必填,傳遞order_dish參數标志這是一筆掃碼點菜的資料    "\"user_id\":\"2088712969xxxxxx\","+//user_id以2088開頭,建議傳遞,此參數會影響服務card的實時重新整理,可通過使用者資訊授權接口擷取    "\"date_time\":\"2018-01-26 14:38:30\"," +      "\"action_detail\":{"+    "\"totalPrice\":\"33\","+ //總價,這裡需要注意的是機關分    "\"discountPrice\":\"33\","+ //優惠金額,這裡需要注意的是機關分    "\"realPrice\":\"33\","+ //實際支付,這裡需要注意的是機關分    //從第三方平台進入開發者應用,後産生的資料,傳入第三方平台域名,    //比如目前資料是支付寶掃碼後産生,傳入支付寶域名alipay.com    //是在微信打開後産生的資料,傳入微信域名weixin.qq.com    //是在口碑打開後産生的資料,傳入口碑域名koubei.com    //如果資料不是從第三方平台進入後産生的資料,設定自己的域名即可    //字段内容不做強制校驗。    "\"source\":\"alipay.com\","+    "\"status\":\"13\","+ //13商家确認,使用者待支付    //外部訂單号,這裡需要注意的是,從使用者下單,商家确認,待支付,支付完成,是一筆訂單    "\"outOrderId\":\"20180126145930111\","+    "\"tableCode\":\"A05\","+ //桌号,此參數必填,該參數會影響該餐台的card更新    "\"people\":\"2\","+//消費人數,建議傳遞    //detailUrl參數必傳,直接影響到支付寶錢包-口碑tab-我-我的訂單-服務訂單,點選一條資料後跳轉的連結    //傳入要求參考文檔要求    "\"detailUrl\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\","+    //菜品清單    //goodsId菜品ID,自定義    //goodsName 菜品名稱,自定義    //price 價格,機關為分,自定義    //num 點菜數量(int),自定義    "\"dish\":[{\"goodsId\":\"216137\",\"price\":2,\"num\":1,\"goodsName\":\"醬爆茄子\"}],"+//菜品清單    "\"statusDesc\":\"待支付\","+//狀态文案說明,會影響card左上角的文案。請準确描述目前的狀态    //行動點對象清單,每次更新全量覆寫,此參數會直接影響服務card上面的按鈕顯示。請準确描述目前的狀态    //String name ; 行動名稱(比如,去買單、加菜,檢視詳情,再來一單)    //String actionUrl 跳轉URL,建議ISV自行對該url進行加簽驗簽,以避免被惡意程式攔截篡改    //String type URL類型(官方常量 addDish(加菜) pay (去買單),官方會根據類型做業務邏輯,如果不在官方說明,請設定為空)    "\"actionUrlList\":[{\"name\":\"檢視詳情\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"\"},"    + "{\"name\":\"去支付\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"pay\"},"    + "{\"name\":\"加菜\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"pay\"}],"+    //與目前訂單有關系的使用者,傳入json數組    //如果不是支付寶使用者不需要傳入,如果order_channel是alipay,強制校驗,必須要傳入    //String userId (支付寶使用者ID)    //String type (使用者ID行為類型),type 可以選擇設定字元串value:pay,pushOrder,normal    //type各value值含義說明:    //pay:支付者    //pushOrder:下單的使用者    //normal:普通使用者,沒有做特殊說明的都是普通使用者    "\"realtionUserList\":[{\"userId\":\"2088712969xxxxxx\",\"type\":\"pushOrder\"}]"+    "}," +    //店鋪關聯關系。标記目前接口涉及到的店鋪資訊,同時如果傳入的資料在口碑不存在,口碑會建立一條shop_id+outer_id+type的關聯資料    //傳遞之後,建議不要再修改此參數    "\"outer_shop_do\":{"+    "\"shop_id\":\"20170803000770000000xxxxxxxx\","+//門店id    "\"outer_id\":\"123456\","+//ISV系統中與口碑店鋪shop_id關聯的ISV店鋪主鍵    "\"type\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\""+//建議直接傳入ISV的域名    "},"+          "\"entity\":\"user\"," +    "\"action_outer_id\":\"20180126145930222\"," +//每次請求的唯一id,需開發者自行保證此參數值每次請求的唯一性    "\"order_channel\":\"isv\"" +//該字段建議填寫。值定義:alipay、weixin、other、isv"}");          AlipayOfflineProviderUseractionRecordResponse response;        try {            response = alipayClient.execute(request);              if (response.isSuccess()) {                System.out.println("調用成功" + response.getBody());            } else {                System.out.println("調用失敗" + response.getBody());            }          } catch (AlipayApiException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }           

(3)回流14狀态(已支付)資料,并清台。代碼demo: 

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",            AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json","GBK",AlipayConfig.alipay_public_key,"RSA2");          AlipayOfflineProviderUseractionRecordRequest request = new AlipayOfflineProviderUseractionRecordRequest();    //request.putOtherTextParam("app_auth_token","201801BB6b27c190986b4dac9e85e66d5aec7X35");第三方應用授權    request.setBizContent("{" +    //內建階段傳遞此參數,傳遞之後,在支付寶錢包-口碑tab-我-我的訂單-服務訂單中顯示一條資料,正式環境預設有顯示服務訂單的能力,不用傳遞此參數    "\"is_test_user\":\"1\","+      "\"source\":\"alipay.com\"," +    "\"action_type\":\"order_dishes\"," +    "\"industry\":\"REPAST\"," +    "\"order_type\":\"order_dish\"," +//掃碼點菜場景此參數必填,傳遞order_dish參數标志這是一筆掃碼點菜的資料    "\"user_id\":\"2088712969xxxxxx\","+//user_id以2088開頭,建議傳遞,此參數會影響服務card的實時重新整理,可通過使用者資訊授權接口擷取    "\"date_time\":\"2018-01-26 14:44:30\"," +      "\"action_detail\":{"+    "\"totalPrice\":\"33\","+ //總價,這裡需要注意的是機關分    "\"discountPrice\":\"33\","+ //優惠金額,這裡需要注意的是機關分    "\"realPrice\":\"33\","+ //實際支付,這裡需要注意的是機關分    //從第三方平台進入開發者應用,後産生的資料,傳入第三方平台域名,    //比如目前資料是支付寶掃碼後産生,傳入支付寶域名alipay.com    //是在微信打開後産生的資料,傳入微信域名weixin.qq.com    //是在口碑打開後産生的資料,傳入口碑域名koubei.com    //如果資料不是從第三方平台進入後産生的資料,設定自己的域名即可    //字段内容不做強制校驗。    "\"source\":\"alipay.com\","+    "\"status\":\"14\","+ //13商家确認,使用者待支付          //下面三個參數在14狀态下必傳    "\"payTime\":\"\","+ //注意,這裡是精确到毫秒,此參數傳遞錯誤,會影響清台後的服務card正常顯示    "\"channel\":\"alipay\","+    "\"payOrderNo\":\"2018012321001004350510117761\","+                //外部訂單号,這裡需要注意的是,從使用者下單,商家确認,待支付,支付完成,是一筆訂單    "\"outOrderId\":\"20180126145930222\","+    "\"tableCode\":\"A05\","+ //桌号,此參數必填,該參數會影響該餐台的card更新    "\"people\":\"2\","+//消費人數,建議傳遞    //detailUrl參數必傳,直接影響到支付寶錢包-口碑tab-我-我的訂單-服務訂單,點選一條資料後跳轉的連結    //傳入要求參考文檔要求    "\"detailUrl\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\","+    //菜品清單    //goodsId菜品ID,自定義    //goodsName 菜品名稱,自定義    //price 價格,機關為分,自定義    //num 點菜數量(int),自定義    "\"dish\":[{\"goodsId\":\"216137\",\"price\":2,\"num\":1,\"goodsName\":\"醬爆茄子\"}],"+//菜品清單    "\"statusDesc\":\"已支付\","+//狀态文案說明,會影響card左上角的文案。請準确描述目前的狀态    //代表是否清桌,預設0。1:清桌,代表桌位可以被他人使用。0:占用,代表座位正在被人使用(比如點菜中、訂單沒有完結,都認為是被占用中,其他人員無法再次下單)    //對表現層的影響是,如果傳了1,則隻有支付使用者和下單使用者在傳遞的payTime參數内的半小時見realtionUserList參數)能看到card,其他使用者為新的card。    //如果傳了0,則所有使用者掃桌碼都會看到目前card。    "\"hasClosed\":\"1\","+    //行動點對象清單,每次更新全量覆寫,此參數會直接影響服務card上面的按鈕顯示。請準确描述目前的狀态    //String name ; 行動名稱(比如,去買單、加菜,檢視詳情,再來一單)    //String actionUrl 跳轉URL,建議ISV自行對該url進行加簽驗簽,以避免被惡意程式攔截篡改    //String type URL類型(官方常量 addDish(加菜) pay (去買單),官方會根據類型做業務邏輯,如果不在官方說明,請設定為空)    "\"actionUrlList\":[{\"name\":\"檢視詳情\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"pay\"},"    + "{\"name\":\"再下一單\",\"actionUrl\":\"http://www.ieasy360.com\",\"type\":\"pay\"}],"+    //與目前訂單有關系的使用者,傳入json數組    //如果不是支付寶使用者不需要傳入,如果order_channel是alipay,強制校驗,必須要傳入    //String userId (支付寶使用者ID)    //String type (使用者ID行為類型),type 可以選擇設定字元串value:pay,pushOrder,normal    //type各value值含義說明:    //pay:支付者    //pushOrder:下單的使用者    //normal:普通使用者,沒有做特殊說明的都是普通使用者    "\"realtionUserList\":[{\"userId\":\"2088712969xxxxxx\",\"type\":\"pay\"}]"+    "}," +    //店鋪關聯關系。标記目前接口涉及到的店鋪資訊,同時如果傳入的資料在口碑不存在,口碑會建立一條shop_id+outer_id+type的關聯資料    //傳遞之後,建議不要再修改此參數    "\"outer_shop_do\":{"+    "\"shop_id\":\"2017080300077000000044490772\","+//門店id    "\"outer_id\":\"123456\","+//ISV系統中與口碑店鋪shop_id關聯的ISV店鋪主鍵    "\"type\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\""+//建議直接傳入ISV的域名    "},"+          "\"entity\":\"user\"," +    "\"action_outer_id\":\"20180126145430111\"," +//每次請求的唯一id,需開發者自行保證此參數值每次請求的唯一性    "\"order_channel\":\"isv\"" +//該字段建議填寫。值定義:alipay、weixin、other、isv      "}");          AlipayOfflineProviderUseractionRecordResponse response;        try {            response = alipayClient.execute(request);              if (response.isSuccess()) {                System.out.println("調用成功" + response.getBody());            } else {                System.out.println("調用失敗" + response.getBody());            }          } catch (AlipayApiException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }           

(4)回流15狀态(一般這個狀态是點餐過程中有異常情況,需要結束點餐流程的時候回流)資料。代碼demo: 

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",            AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json","GBK",AlipayConfig.alipay_public_key,"RSA2");          AlipayOfflineProviderUseractionRecordRequest request = new AlipayOfflineProviderUseractionRecordRequest();    //request.putOtherTextParam("app_auth_token","201801BB6b27c190986b4dac9e85e66d5aec7X35");第三方應用授權    request.setBizContent("{" +    //內建階段傳遞此參數,傳遞之後,在支付寶錢包-口碑tab-我-我的訂單-服務訂單中顯示一條資料,正式環境預設有顯示服務訂單的能力,不用傳遞此參數    "\"is_test_user\":\"1\","+      "\"source\":\"alipay.com\"," +    "\"action_type\":\"order_dishes\"," +    "\"industry\":\"REPAST\"," +    "\"order_type\":\"order_dish\"," +//掃碼點菜場景此參數必填,傳遞order_dish參數标志這是一筆掃碼點菜的資料    "\"user_id\":\"20887129xxxxxxxx\","+//user_id以2088開頭,建議傳遞,此參數會影響服務card的實時重新整理,可通過使用者資訊授權接口擷取    "\"date_time\":\"2018-01-26 16:28:30\"," +      "\"action_detail\":{"+    "\"totalPrice\":\"\","+ //總價,15狀态可傳空,但必傳要傳遞此參數,否則接口調用會報錯    "\"discountPrice\":\"\","+ //優惠金額,15狀态可傳空,但必傳要傳遞此參數,否則接口調用會報錯    "\"realPrice\":\"\","+ //實際支付,15狀态可傳空,但必傳要傳遞此參數,否則接口調用會報錯    //從第三方平台進入開發者應用,後産生的資料,傳入第三方平台域名,    //比如目前資料是支付寶掃碼後産生,傳入支付寶域名alipay.com    //是在微信打開後産生的資料,傳入微信域名weixin.qq.com    //是在口碑打開後産生的資料,傳入口碑域名koubei.com    //如果資料不是從第三方平台進入後産生的資料,設定自己的域名即可    //字段内容不做強制校驗。    "\"source\":\"alipay.com\","+    "\"status\":\"15\","+ //關閉點餐流程          //外部訂單号,這裡需要注意的是,從使用者下單,商家确認,待支付,支付完成,是一筆訂單    "\"outOrderId\":\"20180126145930222\","+    "\"tableCode\":\"A05\","+ //桌号,此參數必填,該參數會影響該餐台的card更新    //detailUrl參數必傳,直接影響到支付寶錢包-口碑tab-我-我的訂單-服務訂單,點選一條資料後跳轉的連結    //傳入要求參考文檔要求    "\"detailUrl\":\"http://17675wt546.iok.la:29682/pc/notify_url.jsp\","+    //與目前訂單有關系的使用者,傳入json數組    //如果不是支付寶使用者不需要傳入,如果order_channel是alipay,強制校驗,必須要傳入    //String userId (支付寶使用者ID)    //String type (使用者ID行為類型),type 可以選擇設定字元串value:pay,pushOrder,normal    //type各value值含義說明:    //pay:支付者    //pushOrder:下單的使用者    //normal:普通使用者,沒有做特殊說明的都是普通使用者    "\"realtionUserList\":[{\"userId\":\"20887129xxxxxxxx\",\"