「やさしく簡単に」割引アプリ制作
アプリ制作のための事前準備については、下記のリンクをご確認ください。
手順 | プロセス | 内容 | 参考ページ |
---|---|---|---|
1 | Cafe24 Front API呼び出し |
|
|
2 | 割引および「HMAC」 |
|
|
3 | 割引適用 |
|
1. Cafe24カート/注文書の商品情報
変数名 | タイプ | 役割 | sample data |
---|---|---|---|
sPage | string | カート("ORDER_BASKET")/注文書("ORDER_ORDERFORM")を区別 |
var sPage
"ORDER_BASKET";//カートの場合 "ORDER_ORDERFORM"; //注文書の場合 |
aBasketProductData | array | カートの商品情報 |
var aBasketProductData
[ { "delvtype": "A", "main_cate_no": 1, "product_no": 21, "opt_id": "000A", "product_type": "normal_type", "naver_used_exception": "F", "product_qty": 1, "quantity": 1, "check_quantity": 1, "check_quantity_type": "O", "option_add": "F", "product_min": 1, "product_max_type": "F", "product_max": 0, "product_code": "P000000V", "product_price": 10000, "opt_price": 0, "product_sum_price": 10000, "product_sale_price": 10000, "product_name": "商品A", "opt_str": "", "item_code": "P000000V000A", "option_type": "T", "has_option": "F", "has_option_add": "F", "is_set_product": "F", "set_product_name": "", "set_product_no": 0, "basket_prd_no": 101, "item_listing_type": "C", "is_oversea_able": true, "set_product_list": null, "buy_unit": 1, "check_buy_unit_type": "O", "wish_selected_item": "", "wish_save_data": "", "olink_data": "", "product_paymethod": "cash,mileage", "option_attached_file_info_json": "", "total_unit_add_sale": 0, "use_store_pickup": "F", "layer_option_str": null, "sIsBenefitEventProduct": "F", "check_buy_unit": 1 } ]; |
aBasketProductOrderData | array | 注文書の商品情報 |
var aBasketProductOrderData
[ { "product_qty": 1, "quantity": 1, "product_sum_price": 10000, "option_add": "F", "option_type": "T", "set_product_no": 0, "basket_prd_no": 101, "product_no": 21, "item_code": "P000000V000A", "product_price": 10000, "opt_price": 0, "product_sale_price": 10000 } ]; |
2. 「HMAC」仕様
3. Cafe24のカート/注文書「callback」関数のリクエスト仕様
a. 「パラメーター1・2・3」は仕様のDepthになります。
パラメーター1 | パラメーター2 | パラメーター3 | 用途 | タイプ |
---|---|---|---|---|
mall_id | ショップID | string | ||
shop_no | マルチショップ番号 | string | ||
member_id | 会員ID | string | ||
member_group_no | 会員グループ | string | ||
product_discount | 割引商品情報 | array | ||
basket_prd_no | カート番号 | string | ||
product_no | 商品番号 | string | ||
item_code | 商品コード | string | ||
product_qty | 数量 | string | ||
product_price | 商品金額 | string | ||
opt_price | オプション金額 | string | ||
product_sale_price | 商品の割引適用金額 | string | ||
discount_price | 商品の割引金額 | string | ||
discount_info | 適用された割引の固有番号リスト | string | ||
order_discount | 割引注文情報 | array | ||
no | 割引固有番号 | string | ||
price | 商品の割引金額 | string | ||
apply_product | 割引を適用した商品コード | string | ||
app_discount_info | 割引の詳細情報 | array | ||
no | 割引固有番号 | string | ||
type | 割引タイプ | string | ||
name | 割引名 | string | ||
icon | 割引アイコン | string | ||
config | 割引設定 | JSON Object(or object) | ||
value | 割引金額 | string | ||
value_type | 割引算定タイプ(W:定額, P:定率) | string | ||
time | 割引リクエスト | string | ||
trace_no | 追跡番号
|
string | ||
app_key | app_key | string | ||
「HMAC」暗号化情報 | 「HMAC」暗号化情報 | string |
Sample Data
{ "mall_id": "cafe24_mall", "shop_no": 1, "member_id": "", "member_group_no": 0, "product_discount": [ { "basket_prd_no": 87, "product_no": 20, "item_code": "P000000U000A", "product_qty": 1, "product_price": 10000, "opt_price": 0, "product_sale_price": 10000, "discount_price": 0, "discount_info": [] }, { "basket_prd_no": 87, "product_no": 21, "item_code": "P000000U000B", "product_qty": 1, "product_price": 20000, "opt_price": 0, "product_sale_price": 20000, "discount_price": 0, "discount_info": [] } ], "order_discount": [ { "no": "200", "price": "1000", "apply_product": "P000000U000A,P000000U000B" } ], "app_discount_info": [ { "no": 200, "type": "O", "name": "FRIDAY_DISCOUNT", "icon": "http://placehold.it/32x32", "config": { "value": 1000, "value_type": "W" } } ], "time": "1536672695", "trace_no": "20180911223134Qkgj54", "app_key": "9M0gI35ANt7gDicnD02u8D", "hmac": "eOEafN86qA4zh49BkjUAhlB3zF5CqVruBNpS46QTVVs=" }
Front-end
var SALEAPP_FRONT_FUNCTION = { app_do_sale: function (params) {//アプリの割引呼び出しおよび適用 $.ajax({ url: "{do_sale_url}", dataType: "json", method: "POST", data: { 'mall_id': params.ec_mall_id , 'shop_no': params.shop_no , 'member_id': params.member_id , 'guest_key': params.guest_key , 'member_group_no': params.group_no , 'product': JSON.stringify(params.orderInfos) , 'time': Math.ceil(new Date().getTime() / 1000) }, success: function (result) { console.log('SALE success!'); AppCallback.setDiscountPrice(JSON.stringify(result)); }, error: function (e) { console.log('SALE error!'); } }); }, app_init_sale: function () {//基本情報および商品情報の設定 var app_req_params = {}; var orderInfos; if (sPage == 'ORDER_BASKET') //カートの場合 orderInfos = aBasketProductData; else if (sPage == 'ORDER_ORDERFORM') //注文書の場合 orderInfos = aBasketProductOrderData; if (orderInfos.length <= 0) return; app_req_params.orderInfos = orderInfos; //CAFE24FrontAPI活用の基本情報照会 (function (CAFE24API) { app_req_params.ec_mall_id = CAFE24API.MALL_ID; app_req_params.shop_no = CAFE24API.SHOP_NO; //会員情報照会 CAFE24API.getMemberInfo(function (data) { app_req_params.member_id = data.id.member_id; app_req_params.group_no = Number(data.id.group_no); if (app_req_params.member_id == null) app_req_params.guest_key = data.id.guest_id; SALEAPP_FRONT_FUNCTION.app_do_sale(app_req_params); }); })(CAFE24API.init('{client_id}')); } }; }); })(CAFE24API.init('{client_id}')); } }; //window.onloadの確認後、イベントリスナに登録 if (document.readyState == 'complete') { SALEAPP_FRONT_FUNCTION.app_init_sale(); } else { window.addEventListener('load', SALEAPP_FRONT_FUNCTION.app_init_sale); }
Data
{ "mall_id": "cafe24_mall", "shop_no": "1", "member_id": "", "guest_key": "9f2c9a3cb0c04a4ff394596ebb23f5cc", "member_group_no": "0", "time": "1536672695", "product": [ { "product_qty": 1, "product_no": 20, "product_price": 10000, "product_sale_price": 100000, "opt_price": 0, "product_name": "商品A", "basket_prd_no": 87, "item_code": "P000000U000A" }, { "product_qty": 1, "product_no": 21, "product_price": 20000, "product_sale_price": 20000, "opt_price": 0, "product_name": "商品B", "basket_prd_no": 87, "item_code": "P000000U000B" } ] }
{ "mall_id": "cafe24_mall", "shop_no": 1, "member_id": "", "member_group_no": 0, "product_discount": [ { "basket_prd_no": 87, "product_no": 20, "item_code": "P000000U000A", "product_qty": 1, "product_price": 10000, "opt_price": 0, "product_sale_price": 10000, "discount_price": 0, "discount_info": [] }, { "basket_prd_no": 87, "product_no": 21, "item_code": "P000000U000B", "product_qty": 1, "product_price": 20000, "opt_price": 0, "product_sale_price": 20000, "discount_price": 0, "discount_info": [] } ], "order_discount": [ { "no": "200", "price": "1000", "apply_product": "P000000U000A,P000000U000B" } ], "app_discount_info": [ { "no": 200, "type": "O", "name": "FRIDAY_DISCOUNT", "icon": "http://placehold.it/32x32", "config": { "value": 1000, "value_type": "W" } } ], "time": "1536672695", "trace_no": "20180911223134Qkgj54", "app_key": "9M0gI35ANt7gDicnD02u8D", "hmac": "eOEafN86qA4zh49BkjUAhlB3zF5CqVruBNpS46QTVVs=" }
Back-end
public String orderSale(@RequestParam OrderVo orderInfo, HttpServletResponse res) { //Cross Domain問題を避けるための必須入力コード res.addHeader("Access-Control-Allow-Origin", "*"); Gson gson = new Gson(); String trace_no = makeTrace_no(); LinkedHashMaprespOrderMap = saleService.doSale(orderInfo, trace_no); if (orderInfo.getMember_id() != null && !orderInfo.getMember_id().isEmpty()) respOrderMap.put("guest_key", saleService.getEncMD5(orderInfo.getMember_id())); else respOrderMap.put("guest_key", orderInfo.getGuest_key()); respOrderMap.put("hmac", saleService.getHmac(respOrderMap)); respOrderMap.remove("guest_key"); log.info("[" + trace_no + "]" + "response_params : " + respOrderMap.toString()); return gson.toJson(respOrderMap); }
Data
{ "mall_id": "cafe24_mall", "shop_no": "1", "member_id": "", "guest_key": "9f2c9a3cb0c04a4ff394596ebb23f5cc", "member_group_no": "0", "time": "1536672695", "product": [ { "product_qty": 1, "product_no": 20, "product_price": 10000, "product_sale_price": 100000, "opt_price": 0, "product_name": "商品A", "basket_prd_no": 87, "item_code": "P000000U000A" }, { "product_qty": 1, "product_no": 21, "product_price": 20000, "product_sale_price": 20000, "opt_price": 0, "product_name": "商品B", "basket_prd_no": 87, "item_code": "P000000U000B" } ] }
{ "mall_id": "cafe24_mall", "shop_no": 1, "member_id": "", "member_group_no": 0, "product_discount": [ { "basket_prd_no": 87, "product_no": 20, "item_code": "P000000U000A", "product_qty": 1, "product_price": 10000, "opt_price": 0, "product_sale_price": 10000, "discount_price": 0, "discount_info": [] }, { "basket_prd_no": 87, "product_no": 21, "item_code": "P000000U000B", "product_qty": 1, "product_price": 20000, "opt_price": 0, "product_sale_price": 20000, "discount_price": 0, "discount_info": [] } ], "order_discount": [ { "no": "200", "price": "1000", "apply_product": "P000000U000A,P000000U000B" } ], "app_discount_info": [ { "no": 200, "type": "O", "name": "FRIDAY_DISCOUNT", "icon": "http://placehold.it/32x32", "config": { "value": 1000, "value_type": "W" } } ], "time": "1536672695", "trace_no": "20180911223134Qkgj54", "app_key": "9M0gI35ANt7gDicnD02u8D", "hmac": "eOEafN86qA4zh49BkjUAhlB3zF5CqVruBNpS46QTVVs=" }
Back-end
public double getDiscountAmount() { Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); int day_num = calendar.get(Calendar.DAY_OF_WEEK); double discount_amount = 0; if (day_num == 6) { discount_amount = 1000; } return discount_amount; }
Back-end
private String makeHmac(String plainText) { log.info("[" + trace_no + "]" + "makeHmac plainText : " + plainText); String cypHmac = ""; try { Mac mac = Mac.getInstance(Const.algorithm); mac.init(new SecretKeySpec(Const.app_secret_key.getBytes(), Const.algorithm)); mac.update(plainText.getBytes(Const.character_set)); cypHmac = Base64.encodeBase64String(mac.doFinal()); } catch (UnsupportedEncodingException | NoSuchAlgorithmException | InvalidKeyException e) { e.printStackTrace(); } log.info("[" + trace_no + "]" + "CypHmac : " + cypHmac); return cypHmac; }
Data
{ "mall_id": "cafe24_mall", "shop_no": 1, "member_id": "", "member_group_no": 0, "product_discount": [ { "basket_prd_no": 87, "product_no": 20, "item_code": "P000000U000A", "product_qty": 1, "product_price": 10000, "opt_price": 0, "product_sale_price": 10000, "discount_price": 0, "discount_info": [] } ], "order_discount": [ { "no": "200", "price": "1000", "apply_product": "P000000U000A" } ], "app_discount_info": [ { "no": 200, "type": "O", "name": "FRIDAY_DISCOUNT", "icon": "http://placehold.it/32x32", "config": { "value": 1000, "value_type": "W" } } ], "time": "1536672695", "trace_no": "20180911223134Qkgj54", "app_key": "9M0gI35ANt7gDicnD02u8D", "guest_key": "9f2c9a3cb0c04a4ff394596ebb23f5cc" }
"FR/ZWH2Fj6cF5KMyCEqxIOELFVNRFcaPmmQBbAj7N7U="
Cafe24ショップのデータ定義および割引の適用順序
以下の項目はCafe24ショップに連携されるデータです。
項目 | 内容 |
---|---|
割引算定タイプ |
|
適用範囲 |
|
適用方法 |
|
割引タイプ |
|
割引を適用する会員の範囲 |
|
割引できる価格の範囲 | 購入金額〇円以上 |
割引できる購入数量の範囲 | 購入数量〇点以上 |
割引特典アプリケーションで作成された注文に対して追加の連携が必要な場合、cafe24 Developersに掲載の注文(order)APIをご参考ください。
(「Recipe」サービスローンチ後、リアルタイムで連携できるようになります)
寄せられたご意見は今後のサービス運用の参考とさせていただきます。