注意事項(xiàng)

1. 請(qǐng)求方式: HTTP + JSON + POST / GET

2. 字段名均為小寫

3. 統(tǒng)一使用UTF-8編碼

4. 春雨測(cè)試服務(wù)地址 https://test.chunyutianxia.com/,正式服務(wù)地址 http://www.bzejh.com/

5. 第三方用戶可以使用管理后臺(tái)進(jìn)行自測(cè)函卒,該管理賬戶請(qǐng)聯(lián)系相關(guān)春雨人員開通

6. 春雨所有環(huán)境的機(jī)房出口IP张相,如需增加到白名單芽嗓,請(qǐng)使用:

  • 所有云主機(jī)默認(rèn)外網(wǎng)(natgw): 123.59.151.95
  • 物理機(jī)外網(wǎng)(代理vpn), 123.59.151.126
  • 云主機(jī)重要線上業(yè)務(wù),117.50.107.208/28扶楣,即117.50.107.208-117.50.107.223共16個(gè)ip地址

7. 合作方需按照跟春雨商定的合作方式來(lái)開發(fā)撤忆,不能接入未合作的問診方式

8. 關(guān)于醫(yī)生總結(jié):API渠道圖文問題關(guān)閉后,醫(yī)生仍可以發(fā)送總結(jié)消息(以醫(yī)生文字回復(fù)形式)來(lái)通知患者(關(guān)閉后患者不可復(fù))睬毒,如存在醫(yī)生在問題關(guān)閉后發(fā)總結(jié)情況矿钩,請(qǐng)確保可以接收到春雨推送信息并及時(shí)通知患者;

9. 相關(guān)服務(wù)開通權(quán)限后方可使用

簽名校驗(yàn)機(jī)制

雙方進(jìn)行通信時(shí)遣株,使用加密密鑰(partner_key)進(jìn)行安全校驗(yàn), 簽名密鑰值用sign標(biāo)識(shí)蛀家,需嚴(yán)格保密。

簽名生成規(guī)則按使用場(chǎng)景分為兩類:

  • 非回調(diào)類型:使用key革哄、atime馅溉、user_id生成sign值
  • 回調(diào)接口類型:使用key、atime庭叙、problem_id生成sign值(電話類服務(wù)使用service_id替換掉problem_id)

非回調(diào)類型生成方式示例如下:

# PYTHON 版本 生成方法
                import hashlib
                # 合作方 partner_key,注意不是 partner
                partner_key = 'XKBP1Oqut0r2LiGV'
                # UNIX TIMESTAMP 最小單位為秒
                atime = '1467098815'
                # 第三方用戶唯一標(biāo)識(shí)劲阎,可以為字母與數(shù)字組合的字符串
                user_id = 'A800130'
                # 獲得簽名: md5的32位結(jié)果取中間16位
                sign = hashlib.md5(partner_key + atime + user_id).hexdigest()[8:-8]
                # 輸出sign:5afda19c5d65a7a7
                print sign
                
// PHP 版本 生成方法
                // 合作方 partner_key, 注意不是 partner
                $partner_key = "XKBP1Oqut0r2LiGV";
                // UNIX TIMESTAMP 最小單位為秒
                $atime = "1467098815";
                // 第三方用戶唯一標(biāo)識(shí)涧衙,可以為字母與數(shù)字組合的字符串哪工。
                $user_id = "A800130";
                // 生成簽名 5afda19c5d65a7a7
                $sign = substr(md5($partner_key.$atime.$user_id), 8, 16);
                // 輸出sign:5afda19c5d65a7a7
                echo "sign: ".$sign;
                
// JAVA 版本 生成方法
                import java.security.MessageDigest;
                import java.security.NoSuchAlgorithmException;
                import org.apache.commons.codec.binary.Hex;

                public class SignTest {

                    // 計(jì)算 Sign
                    private static String getSign(String partner_key, String atime, String user_id)
                                throws NoSuchAlgorithmException{
                        String info = partner_key + atime + user_id;
                        MessageDigest md5 = MessageDigest.getInstance("MD5");
                        byte[] srcBytes = info.getBytes();
                        md5.update(srcBytes);
                        byte[] resultBytes = md5.digest();
                        String resultString = new String(new Hex().encode(resultBytes));
                        return resultString.substring(8, 24);
                    }

                    public static void main( final String[] args ){
                        try {
                            // 合作方 partner_key, 注意不是 partner
                            String partner_key = "XKBP1Oqut0r2LiGV";
                            // UNIX TIMESTAMP 最小單位為秒
                            String atime = "1467098815";
                            // 第三方用戶唯一標(biāo)識(shí)弧哎,可以為字母與數(shù)字組合的字符串。
                            String user_id = "A800130";
                            // 計(jì)算sign結(jié)果為: 5afda19c5d65a7a7
                            String sign = SignTest.getSign(partner_key, atime, user_id);
                            System.out.println(sign);
                        }
                        catch (Exception ex)
                        {
                            ex.printStackTrace();
                        }

                    }
                }
                
// C# 版本 生成方法
                using System;
                using System.Security.Cryptography;
                using System.Text;

                public class Test
                {
                    public static void Main()
                    {
                        // C#版本生成方法
                        string partner_key = "XKBP1Oqut0r2LiGV";
                        // UNIX TIMESTAMP 最小單位為秒
                        string atime = "1467098815";
                        // 第三方用戶唯一標(biāo)識(shí)稚虎,可以為字母與數(shù)字組合的字符串
                        string user_id = "A800130";
                        // 獲得簽名: md5的32位結(jié)果取中間16位
                        MD5 md5 = new MD5CryptoServiceProvider();
                        byte[] output = md5.ComputeHash(Encoding.UTF8.GetBytes(partner_key+atime+user_id));
                        string sign = BitConverter.ToString(output).Replace("-","").Substring(8, 16).ToLower();
                        // 輸出sign:5afda19c5d65a7a7
                        Console.WriteLine(sign);
                    }
                }
                

提問數(shù)據(jù)結(jié)構(gòu)

JSONArray集合,格式: [contentItem 1, contentItem 2,..., contentItem n]

contentItem含義:

  • 文字內(nèi)容 {'type': 'text', 'text': '這是一段文本形式的內(nèi)容'}
  • 圖片內(nèi)容 {'type': 'image', 'file': '這是圖片形式的內(nèi)容,這里是圖片的 url'}
  • 音頻內(nèi)容 {'type': 'audio', 'file': '這是語(yǔ)音形式的內(nèi)容,這里是音頻文件的 url'}
  • 視頻內(nèi)容 {'type': 'video', 'file': '這是視頻形式的內(nèi)容,這里是視頻文件的 url','duration':10, 'partner_cover_image':'視頻封面圖url'}
  • 病人資料 {'type': 'patient_meta', 'age': '15 歲', 'sex': '男', 'name': '張三'}

生成content代碼示例如下:

說(shuō)明:

  • 眾包服務(wù)為確保分診準(zhǔn)確性撤嫩,患者首問字?jǐn)?shù)請(qǐng)限制在10-500字;且務(wù)必傳給春雨提問患者姓別蠢终、年齡字段序攘;
  • 創(chuàng)建問題時(shí)首問請(qǐng)務(wù)必提問醫(yī)療問題,非醫(yī)療問題會(huì)被舉報(bào)寻拂;
  • 圖片文件要求為JPG或PNG程奠,單張最大不超過5M,每次最多可同時(shí)上傳9張祭钉,多張圖片時(shí)使用多個(gè)contentItem瞄沙;
  • 音頻文件格式要求是MP3,最長(zhǎng)兩分鐘危晕;
  • 視頻文件要求為.mp4格式坟荤,時(shí)長(zhǎng)不超過1分鐘。duration單位為秒;
  • 提交的文件URL挽沧,春雨目前不會(huì)下載保存贷弧,請(qǐng)確保提交的文件URL可以長(zhǎng)期穩(wěn)定訪問
  • 使用JSON POST時(shí),請(qǐng)注意content類型為string而不是嵌套的json類型
# PYTHON 版本 生成方法
import json
# 創(chuàng)建對(duì)話內(nèi)容
content = [
    {"type": "text","text": "這是一段文本形式的內(nèi)容"},
    {"type": "image","file": "這是圖片形式的內(nèi)容,這里是圖片的 url'"},
    {"type": "audio","file": "這是語(yǔ)音形式的內(nèi)容,這里是音頻文件的 url"},
    {"type": "video","file": "這是視頻形式的內(nèi)容,這里是視頻文件的 url","duration": 10,"partner_cover_image": "視頻封面圖url"},
    {"type": "patient_meta","age": "15歲","sex": "男","name": "張三"}
]
# 獲得json string 格式結(jié)果糙官,接口中content字段使用該結(jié)果
content = json.dumps(content)
// 創(chuàng)建對(duì)話內(nèi)容
import json
// 創(chuàng)建對(duì)話內(nèi)容
$content_list = array(
    array ('type'=>'text','text'=>'這是一段文本形式的內(nèi)容'),
    array ('type'=>'image','file'=>'這是圖片形式的內(nèi)容,這里是圖片的 url'),
    array ('type'=>'audio','file'=>'這是語(yǔ)音形式的內(nèi)容,這里是音頻文件的 url'),
    array ('type'=>'video','file'=>'這是視頻形式的內(nèi)容,這里是視頻文件的 url','duration':10'),
    array ('type'=>'patient_meta','age'=>'15 歲', 'sex'=>'男'),
);
// 獲得json string 格式結(jié)果窟潜,接口中content字段使用該結(jié)果
echo json_encode($content_list);
// JAVA 版本 生成方法
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;

public class JsonTest {

    public static void main(String[] args) throws JSONException, ParseException {
        ArrayList content_list = new ArrayList();
        // 添加文本內(nèi)容
        Map c_text = new HashMap();
        c_text.put("type", "text");
        c_text.put("text", "這是一段文本形式的內(nèi)容");
        content_list.add(c_text);
        // 添加圖片內(nèi)容
        Map c_image = new HashMap();
        c_image.put("type", "image");
        c_image.put("file", "這是圖片形式的內(nèi)容,這里是圖片的 url");
        content_list.add(c_image);
        // 添加音頻內(nèi)容
        Map c_audio = new HashMap();
        c_audio.put("type", "audio");
        c_audio.put("file", "這是一段文本形式的內(nèi)容,這里是音頻文件的 url");
        content_list.add(c_audio);
        // 添加視頻內(nèi)容
        Map c_video = new HashMap();
        c_video.put("type", "video");
        c_video.put("file", "這是視頻形式的內(nèi)容,這里是視頻文件的 url','duration':10'");
        content_list.add(c_video);
        // 添加患者信息
        Map c_patient_meta = new HashMap();
        c_patient_meta.put("type", "patient_meta");
        c_patient_meta.put("age", "15 歲");
        c_patient_meta.put("sex", "男");
        content_list.add(c_patient_meta);

        // 輸出結(jié)果
        JSONArray content_json = JSONArray.fromObject(content_list);
        String content = content_json.toString();
        System.out.println(content);
    }
}

科室劃分

一級(jí)科室編碼 具體科室 二級(jí)科室編碼 具體科室
1 婦科 婦科
2 兒科 fb 新生兒科
fa 小兒科
3 內(nèi)科 ai 感染科
ah 血液病科
ag 風(fēng)濕免疫科
af 內(nèi)分泌與代謝科
ae 腎內(nèi)科
ad 消化內(nèi)科
ac 神經(jīng)內(nèi)科
ab 心血管內(nèi)科
aa 呼吸內(nèi)科
4 皮膚性病科 hb 性病科
ha 皮膚科
6 營(yíng)養(yǎng)科 營(yíng)養(yǎng)科
7 骨傷科 cc 創(chuàng)傷科
cb 關(guān)節(jié)科
ca 脊柱科
8 男科 男科
9 外科 bj 甲狀腺乳腺外科
bi 普外科
bh 肛腸科
bg 泌尿外科
bf 康復(fù)科
be 燒傷科
bd 肝膽外科
bc 神經(jīng)外科
bb 心臟與血管外科
ba 胸外科
11 腫瘤及防治科 md 腫瘤中醫(yī)科
mc 介入與放療中心
mb 腫瘤外科
ma 腫瘤內(nèi)科
12 中醫(yī)科 oe 中醫(yī)兒科
od 中醫(yī)男科
oc 中醫(yī)婦科
ob 中醫(yī)外科
oa 中醫(yī)內(nèi)科
13 口腔頜面科 口腔頜面科
14 耳鼻咽喉科 jc 咽喉科
jb 鼻科
ja 耳科
15 眼科
16 整型美容科
17 精神心理科 nb 心理科
na 精神科
21 產(chǎn)科
22 報(bào)告解讀科 qi 預(yù)防保健科
qh 體檢中心
qg 麻醉科
qf 超聲科
qe 心電圖科
qd 病理科
qc 內(nèi)鏡科
qb 放射科
qa 檢驗(yàn)科

Postman調(diào)試工具

Postman接口測(cè)試套件使用說(shuō)明

使用此工具,可以在開發(fā)未完成狀態(tài)下鱼催,驗(yàn)證接口服務(wù)狀態(tài)和業(yè)務(wù)的接入流程羞喻,同時(shí)在開發(fā)過程中,如果遇到問題千覆,報(bào)錯(cuò)等区膨,可以快速幫助定位問題。只需要考慮業(yè)務(wù)參數(shù)姑裂,而不需要關(guān)注簽名馋袜,時(shí)間戳等。

注意:雖然可配置線上的請(qǐng)求舶斧,但請(qǐng)慎重使用欣鳖,如隨意測(cè)試線上接口可能會(huì)導(dǎo)致用戶id被拉黑,多扣費(fèi)等情況茴厉。

使用和配置

1.下載Postman > 7.0版本

2.下載Postman_config.zip并解壓

3.Import->Folder 選擇文件夾導(dǎo)入

在環(huán)境變量配置(1)->全局配置(2)中修改partner

在環(huán)境變量配置中的test(3)泽台、online(4)中配置測(cè)試環(huán)境、線上環(huán)境的partner_key和當(dāng)前環(huán)境的測(cè)試用戶矾缓。

注意:線上測(cè)試必須添加user_id至白名單

在選擇好測(cè)試環(huán)境后怀酷,選擇需要測(cè)試的接口進(jìn)行請(qǐng)求即可,測(cè)試過程中只需要修改業(yè)務(wù)參數(shù)如partner_order_id嗜闻,problem_id等蜕依。不需要再關(guān)注簽名、時(shí)間戳等驗(yàn)證字段

業(yè)務(wù)問題

1琉雳、問題交互次數(shù)定義

答:患者連續(xù)追問直至醫(yī)生回答定義為一次交互样眠。示意圖(以下三種情況均定義為一次交互):

問題交互次數(shù)定義

2、服務(wù)自動(dòng)關(guān)閉邏輯翠肘?

圖文問題醫(yī)生首次答復(fù)后會(huì)重新計(jì)算時(shí)間肩蹬,后續(xù)答復(fù)則不再重新計(jì)算。

問題類型 已回復(fù)自動(dòng)關(guān)閉邏輯 未回復(fù)自動(dòng)關(guān)閉邏輯 測(cè)試環(huán)境自動(dòng)關(guān)閉時(shí)間 關(guān)閉后的問題狀態(tài)
眾包服務(wù) 20次交互或醫(yī)生首次回復(fù)24h后問題關(guān)閉 24h自動(dòng)關(guān)閉 已回復(fù)/未回復(fù)均為1h 關(guān)閉狀態(tài)
眾包升級(jí) 20次交互或醫(yī)生首次回復(fù)24h后問題關(guān)閉 1h自動(dòng)關(guān)閉 已回復(fù)/未回復(fù)均為1h 關(guān)閉狀態(tài)
定向圖文 30次交互或醫(yī)生首次回復(fù)48h后問題關(guān)閉 24h自動(dòng)關(guān)閉 已回復(fù)/未回復(fù)均為1h 關(guān)閉狀態(tài)
名醫(yī)咨詢 10次交互或醫(yī)生首次回復(fù)48h后問題關(guān)閉 24h自動(dòng)關(guān)閉 已回復(fù)/未回復(fù)均為1h 關(guān)閉狀態(tài)
圖文急診 20次交互或醫(yī)生首次回復(fù)30min后問題關(guān)閉 30min自動(dòng)關(guān)閉 已回復(fù)/未回復(fù)均為30min 關(guān)閉狀態(tài)

3档广、健康檔案需要提供哪些字段信息深酗?

答:API對(duì)接方式下,健康檔案包括:性別榛瞪、年齡姚继。具體可參考 開發(fā)前必讀->提問數(shù)據(jù)結(jié)構(gòu)

4、春雨平臺(tái)側(cè)能否提供科室信息?

答:目前春雨平臺(tái)側(cè)可以提供一級(jí)/二級(jí)科室信息几馁,科室列表信息請(qǐng)參見:API接口->定向圖文服務(wù)->找醫(yī)生接口某尘。

5、H5和API的對(duì)接方式下钙阐,收款流程都是什么樣的厦鸠?

答:如以H5形式對(duì)接,春雨直接收費(fèi)颁吭。如以API形式對(duì)接塘坛,用戶直接支付給合作方,合作方再和春雨平臺(tái)定期結(jié)算殃恒。

6植旧、API接入眾包服務(wù):用戶提交問題后,用戶對(duì)系統(tǒng)分配到的科室可以修改嗎离唐?

答:不可以修改病附。

7、允許用戶進(jìn)行評(píng)價(jià)的觸發(fā)條件是什么亥鬓?

答:醫(yī)患交互后即可評(píng)價(jià)醫(yī)生完沪。

8、針對(duì)醫(yī)生評(píng)價(jià)功能嵌戈,不滿意的原因是必填項(xiàng)么覆积?

答:必填。

9熟呛、針對(duì)舉報(bào)功能:被醫(yī)生或系統(tǒng)舉報(bào)的功能宽档,有專門的接口么?用戶被舉報(bào)后惰拱,如何通知到合作方雌贱?

答:被醫(yī)生或系統(tǒng)舉報(bào),無(wú)專門的接口通知搜栽。會(huì)通過【通用接口】的【問題關(guān)閉通知】發(fā)close或refund通知。春雨會(huì)返回對(duì)應(yīng)的被舉報(bào)文案溢牡,請(qǐng)參見【退款及舉報(bào)邏輯】部分贱供。同時(shí)被舉報(bào)后會(huì)以特殊的問題狀態(tài)進(jìn)行標(biāo)識(shí),參見【問題詳情接口】粉怯。

10犁鹤、針對(duì)黑名單功能:當(dāng)用戶被列入黑名單時(shí),用戶再提問時(shí)险朴,會(huì)如何提示舞轧?

答:用戶被加入黑名單后,當(dāng)該用戶提問時(shí),春雨平臺(tái)會(huì)返回錯(cuò)誤碼12003來(lái)進(jìn)行標(biāo)識(shí)羞菊。具體請(qǐng)參見【黑名單邏輯】和【錯(cuò)誤碼】中的對(duì)應(yīng)內(nèi)容贫巴。

技術(shù)問題

1、為何在安卓客戶端的webview中點(diǎn)擊上傳圖片控件沒反應(yīng)隐户?

答: 由于安全因素android webview屏蔽了文件上傳控件炕婶,具體參考:?
https://www.oschina.net/question/23880_50205
安卓5.0及以上版本中,有修改莱预,具體參考:
http://blog.csdn.net/u012912435/article/details/51484211
在在Android5.0及以上版本中使用WebView加載https資源文件時(shí)柠掂,
如果認(rèn)證證書不被Android認(rèn)可,那么會(huì)出現(xiàn)無(wú)法成功加載對(duì)應(yīng)資源問題依沮。
具體解決參考:
https://www.cnblogs.com/zhengshiqiang47/p/6220295.html

2涯贞、為何在H5頁(yè)面點(diǎn)擊創(chuàng)建問題無(wú)效?

答: H5頁(yè)面不能在PC瀏覽器環(huán)境下直接使用危喉,需要在手機(jī)或手機(jī)模擬器環(huán)境下使用宋渔。

3、為何在加載H5頁(yè)面時(shí)候樣式丟失姥饰?

答: H5頁(yè)面所有資源URL為相對(duì)URL傻谁,請(qǐng)確認(rèn)當(dāng)前加載環(huán)境是否支持獲取該資源。

4列粪、什么是atime审磁?

答: atime 為時(shí)間戳,是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)岂座;atime需實(shí)時(shí)獲取态蒂,前后15min有效。

5拉诲、為何在回調(diào)通知里面查不到相關(guān)參數(shù)赤蚜?

答: 春雨發(fā)送第三方回調(diào)通知時(shí)采用POST方式,data為json格式威卑,請(qǐng)確保接口符合要求屁爵。如果仍然未獲取到相關(guān)參數(shù),建議增加request請(qǐng)求內(nèi)容的完整打印消息來(lái)排查原因您凸。

6晚神、每次API接口 創(chuàng)建/追問 問題前都需要先請(qǐng)求賬號(hào)同步接口嗎?

答: 不需要宠宗,新用戶只要同步過一次即可饮协。

7、H5不能直接返回到上級(jí)頁(yè)面嗎瓣硼?

答: 由于H5是嵌入第三方APP的啰价,所以返回欄需要由第三方來(lái)實(shí)現(xiàn)猿文。

8、API付費(fèi)款項(xiàng)是怎樣處理的起便?

答: 第三方需要先在春雨服務(wù)器創(chuàng)建付費(fèi)問診記錄棚贾,然后引導(dǎo)用戶付費(fèi)至第三方平臺(tái),成功后通知春雨服務(wù)器更新訂單缨睡,后續(xù)問診交互同API免費(fèi)問診一致鸟悴。春雨公司定期與第三方公司結(jié)算相關(guān)款項(xiàng)。

9奖年、接口返回"invalid_user"是為什么细诸?

答: 首先 user_id 只可以包含大小寫字母與數(shù)字、下劃線的組合陋守,其次在確認(rèn) user_id 符合格式時(shí)請(qǐng)檢查是否是由于構(gòu)建的數(shù)據(jù)類型(content或者assess_info)格式錯(cuò)誤震贵,導(dǎo)致參數(shù)亂碼(可通過抓包的方式確認(rèn)發(fā)出的數(shù)據(jù)是否正確)。

10水评、H5接入方式下猩系,針對(duì)Android系統(tǒng),填寫病情描述后不能點(diǎn)擊下一步的解決辦法中燥?

答: 參考如下代碼進(jìn)行解決
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
// 前面?zhèn)z個(gè)必須同時(shí)在
webView.setWebChromeClient(new MyWebChromeClient());
webSettings.setAllowFileAccess(true)

11寇甸、API對(duì)接眾包升級(jí)服務(wù):可以使用哪些接口?疗涉。

答:請(qǐng)查看【開發(fā)文檔】中稀渊,【眾包升級(jí)服務(wù)】目錄下的所有接口,【通用接口】下的所有接口图漓,和【第三方回調(diào)管理】的所有接口铐跷。