syntax = "proto3";

package com.ywt.gapi.wx_ins_pay;

option java_multiple_files = true;
option java_package = "com.ywt.gapi.wx_ins_pay";
option java_outer_classname = "WxInsPayProto";

message CreatePayInsOrderRequest {
    string orderType = 1;// 支付类型：RegPay=挂号支付 DiagPay=诊间 支付 InHospPay=住院
    string appId = 2;// 微信分配的公众账号 ID
    string mchId = 3;// 微信支付分配的商户号
    string openId = 4;
    string hospOutTradeNo = 5;// 第三方服务商平台自动生成的一个订单号
    string hospitalName = 6;
    int32 totalFee = 7;// 总共需要支付现金金额。单位为分>0。表示订单总额即全额现金的价格。
    int32 cashFee = 8;// 个账金额，分
    int32 allowFeeChange = 9;// 是否允许预结算费用发生变化。0：不允许 1：允许。当医保局返回的预结算金额与医院上传的金额不一致时，此字段为0 则直接报错，为 1 则以医保局金额为准
    string spbillCreateIp = 10;// 用户端 ip
    string notifyUrl = 11;// 接受微信支付异步通知回调地址
    string body = 12;// 商品描述，商家名称-销售商品类目，参考 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2
    string returnUrl = 13;// 支付后回跳的页面，不论成功或者失败均会回跳。调用方可以在链接中加上支付单号，回跳后查询调用方订单状态，如果订单已支付则成功， 如果订单未支付则进行查单操作确认订单结果
    int32 payType = 14;// 支付方式：1：现金 2：医保 3：现金+医保 备注说明： 当订单要走医保支付时 ① cash_fee>0, paytype 填 3 ② cash_fee=0, paytype 填 2
    int32 insuranceFee = 15;// 医保支付金额，分
    int32 userCardType = 16;// 证件类型，1-身份证
    string userCardNo = 17;// 证件号码，身份证中如果有字母需要转成大写再做 MD5,15位身份证号需要转为18 位
    string userName = 18;// 真实姓名
    string serialNo = 19;// 医院 HIS 系统订单号
    string orgNo = 20;// 医疗机构编码（医保局分配给机构）；德生分配的商户号
    string gmtOutCreate = 21;// 医院下单时间，格式：yyyyMMddHHmmss
    string extendz = 22;// 固定 {\"insurance_fee_type\":\"insurance\"}
    int32 terminal = 23;
    string attach = 24;// 附加数据
    string insUploadFeeResp = 25;// HIS 上传医保接口返回信息
    int32 consumeType = 26;// 医保部分扣费类型。默认为 0：统筹+个账 1：个账 2：统筹
    int32 medInsType = 27; // 医保类型标识，1-广州医保，2-市直医保
}

message CreatePayInsOrderResponse {
    int32 code = 1;
    string msg = 2;
    string medTransId = 3;// 诊疗单 id（微信生成的)
    string payUrl = 4;// 支付链接
    string payAppid = 5;// 支付小程序 appId，当使用医院小程序进行下单时，会返回此参数，医院小程序跳转至该支付小程序进行支付
}

// 查询医保支付订单
message QueryPayInsOrderRequest {
    string hospOutTradeNo = 1;// 订单编号
    string appId = 2;// 微信分配的公众账号 ID
    string mchId = 3;// 微信支付分配的商户号
    int32 terminal = 4;
}

message QueryPayInsOrderResponse {
    int32 code = 1;
    string msg = 2;
    string medTradeState = 3;// 交易状态：SUCCESS—支付成功 REFUND—转入退款 PAYING—支付中 SYS_REFUNDED-支付失败 SYS_REFUNDING- 支 付 失 败，异常处理中 NOTPAY—未支付 CLOSED—已关闭 INITIAL—未绑卡
    string timeEnd = 4;// 订单支付时间，yyyyMMddHHmmss
}

//支付结果通知
message WxPayCallbackRequest {
    string xmlData = 1; //回调的XML数据
}

//结果通知输出
message WxPayCallbackResponse {
    int32 code = 1;
    string respXml = 2;
}

// message RefundRequest {
//     string appId = 1;
//     string mchId = 2;
//     string hospOutTradeNo = 3;// 平台订单号
//     string cancelSerialNo = 4;// 撤销流水号,医保退款必填，医保局无要求则由医院自定义
//     string cancelBillNo = 5;// 撤销单据号,医保诊间退款必填，医保局无要求则由医院自定义
//     string partRefundType = 6;// 部分退款,非必填,不填则全退,CASH_ONLY 则只退现金部分
//     int32 cashRefundFee = 7;// 现金部分退款,不填默认全退，填写时则退指定金额，不能为0，仅当part_refund_type 为空或CASH_ONLY 时生效
//     string requestContent = 8;// 透传医保局,非必填，有需要透传数据到医保局时填写
// }

// message RefundResponse {
//     int32 code = 1;
//     string msg = 2;
//     int32 totalFee = 3;// 订单总金额，单位：分
//     int32 cashRefundFee = 4;// 现金退款金额，单位：分
//     int32 insuranceRefundFee = 5;// 医保退款金额，单位：分（目前只能全额退）
//     string medRefundId = 6;// 微信生成的退款医疗订单号，后续可用来查询退款单
//     string cashRefundId = 7;// 混合支付或纯现金支付时返回
//     string insuranceRefundId = 8;// 混合支付或纯医保支付时返回
// }

// 查询是否绑定医保卡
message VerifyMedInfoRequest {
    string openId = 1;
    string name = 2;
    string idCard = 3;
    int32 terminal = 4;
}

message VerifyMedInfoResponse {
    int32 code = 1;
    string msg = 2;
    bool isValid = 3;// 布尔值，是否绑定医保卡
}

message MarkOpOrderDeletedRequest {
    string orderNo = 1;
}

message MarkOpOrderDeletedResponse {
    int32 code = 1;
    string msg = 2;
}

message WechatAutoRefundCallbackRequest{
    int32 amount = 1;       //已退金额
    int32 bizId = 2;
    int32 orderId = 3;
    string orderNo = 4;
    string refundNo = 5;    //退款单号
    int32 refundStatus = 6; //退款状态 1: 退款成功，2: 退款异常，3: 退款关闭
    string custom = 7;      //回发 custom 数据
}

message WechatAutoRefundCallbackResponse{
    int32 code = 1;
    string info = 2;
}

// 微信医保支付接口，实现在中控-wxInsPay-index.js
service WxInsPayService {
    // 挂号/诊间支付统一下单 API 接口
    rpc createPayInsOrder(CreatePayInsOrderRequest) returns (CreatePayInsOrderResponse);
    // 查询订单
    rpc queryPayInsOrder (QueryPayInsOrderRequest) returns (QueryPayInsOrderResponse);
    // 支付回调
    rpc wxPayCallback (WxPayCallbackRequest) returns (WxPayCallbackResponse);
    // 退款
    // rpc refund (RefundRequest) returns (RefundResponse);
    // 查询医保卡信息/查询是否绑定医保卡
    rpc verifyMedInfo(VerifyMedInfoRequest) returns (VerifyMedInfoResponse);
    // 把订单标记为删除，主要用于腾讯下单失败时将已生成的订单删除，让用户可以重新下单。为了方便线上测试，把该方法实现放在医保服务中
    rpc markOpOrderDeleted(MarkOpOrderDeletedRequest) returns (MarkOpOrderDeletedResponse);
    // 自费门诊订单，微信支付原路退回成功回调
    rpc wechatAutoRefundCallback(WechatAutoRefundCallbackRequest) returns (WechatAutoRefundCallbackResponse);
}