using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PTMedicalInsurance.Common.SMLib; using PTMedicalInsurance.Entity; using PTMedicalInsurance.Helper; using PTMedicalInsurance.Variables; using Sunny.UI.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Data.Linq; using System.Data.Linq.Mapping; using System.Windows.Forms; namespace HeNanMI.Business { public class OneCodePay { public string url; InvokeHelper invoker = new InvokeHelper(); public OneCodePay() { } public int GetCertAndSendToHis(decimal cashPay, out string msg) { msg = ""; if (string.IsNullOrEmpty(Global.pat.ecToken)) { msg = "一码付介质必须是电子凭证或人脸支付,其他介质暂不支持!"; return -1; } if (!Global.pat.isOneCodePayEnabled) { msg = "未在界面勾选启用一码付!"; return -1; } //先查询状态 if (QuerySignedPayStatus(out msg) != 0) { return -1; } JObject jo = JObject.Parse(msg); string stasFlag = JsonHelper.getDestValue(jo, "stasFlag"); string abnRea = JsonHelper.getDestValue(jo, "abnRea"); //解析状态 switch (stasFlag) { case "0": msg = "未签约不可用!" + abnRea; return -1; case "1": //msg = "已签约且可用"; //return 0; break; case "2": msg = "已签约不可用" + abnRea; return -1; default: msg = "返回stasFlag值不正确!"; return -1; } //获取凭证 if (GetPayCert(cashPay, out msg) != 0) { return -1; } else { jo = JObject.Parse(msg); string payCert = JsonHelper.getDestValue(jo, "payCert"); string payChnlName = JsonHelper.getDestValue(jo, "payChnlName"); msg = BuildOneCodePaySuccessResult(payChnlName,payCert); Global.writeLog($"BuildOneCodePaySuccessResult:{msg}"); return 0; } } /// /// 构建一码付结算成功的返回结果(含支付信息) /// /// 支付渠道,如 "ALIPAY" 或 "WECHAT" /// 用户授权码(付款码) /// JSON 格式的 Iris 返回值字符串 private string BuildOneCodePaySuccessResult(string payChannel, string authCode) { if (string.IsNullOrWhiteSpace(payChannel)) MessageBox.Show($"支付渠道不能为空{nameof(payChannel)}"); if (string.IsNullOrWhiteSpace(authCode)) MessageBox.Show($"授权码不能为空{nameof(authCode)}"); string paywCode = ""; if (payChannel == "支付宝") { paywCode = "ALIPAY"; //ALIPAY,WECHAT } if (payChannel == "微信") { paywCode = "WECHAT"; //ALIPAY,WECHAT } var payInfo = new JObject { ["paywCode"] = paywCode, ["authcode"] = authCode }; var result = JsonHelper.setIrisReturnValue( 0, "结算成功", new JObject { ["payInfo"] = payInfo } ); return result.ToString(Formatting.None); // 紧凑格式,符合接口规范 } ///查询一码付状态 public int QuerySignedPayStatus(out string msg) { var request = new QuerySignedPayStatusRequest { token = Global.pat.ecToken, // 电子凭证令牌(模拟值) orgCodg = Global.inf.hospitalNO, // 定点医药机构代码(示例医保编码) orgName = Global.inf.hospitalName, // 机构名称(中文支持) opterId = Global.user.ID, // 经办人员编号 opterName = Global.user.name, // 经办人姓名 devId = Global.curEvt.mac, // 设备唯一标识(如 MAC 地址或 UUID) devIP = Global.curEvt.ip // 设备 IP 地址 }; string jsonStr = JsonConvert.SerializeObject(request, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });//紧凑格式 JObject joRtn = invoker.invokeOneCodePayService("QuerySignedPayStatus", jsonStr); if (JsonHelper.parseOneCodePayRtnValue(joRtn, out msg) != 0) { return -1; } else { msg = OneCodePayEncryptUtil.decrypt(JsonHelper.getDestValue(joRtn, "data.encData"), Global.inf.OneCodePay.apiSecretKey); Global.writeLog("QuerySignedPayStatus(明文)",jsonStr,msg); return 0; } } //获取一码付凭证 public int GetPayCert(decimal cashPay,out string msg) { var request = new GetPayCertRequest { token = Global.pat.ecToken, // 电子凭证令牌(模拟值) ownPaySetlAmt = cashPay.ToString("0.00"), //现金支付金额 orgCodg = Global.inf.hospitalNO, // 定点医药机构代码(示例医保编码) orgName = Global.inf.hospitalName, // 机构名称(中文支持) opterId = Global.user.ID, // 经办人员编号 opterName = Global.user.name, // 经办人姓名 devId = Global.curEvt.mac, // 设备唯一标识(如 MAC 地址或 UUID) devIP = Global.curEvt.ip, // 设备 IP 地址 fixmedinsTrnsSn = Global.pat.recordID //医疗机构交易流水号 }; string jsonStr = JsonConvert.SerializeObject(request, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });//紧凑格式 JObject joRtn = invoker.invokeOneCodePayService("GetPayCert", jsonStr); if (JsonHelper.parseOneCodePayRtnValue(joRtn, out msg) != 0) { return -1; } else { msg = OneCodePayEncryptUtil.decrypt(JsonHelper.getDestValue(joRtn, "data.encData"), Global.inf.OneCodePay.apiSecretKey); Global.writeLog("GetPayCert(明文)", jsonStr, msg); return 0; } } //按照HIS约定返回给前端,前端根据返回结果调用 } /// /// 查询用户一码付状态 - 请求参数 /// public class QuerySignedPayStatusRequest:EntityBase { /// /// 电子凭证令牌 /// [Column(Name = "token", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("电子凭证令牌")] public string token { get; set; } /// /// 定点医药机构代码 /// [Column(Name = "orgCodg", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("定点医药机构代码")] public string orgCodg { get; set; } /// /// 定点医药机构名称 /// [Column(Name = "orgName", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("定点医药机构名称")] public string orgName { get; set; } /// /// 经办人员编号 /// [Column(Name = "opterId", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("经办人员编号")] public string opterId { get; set; } /// /// 经办人员姓名 /// [Column(Name = "opterName", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("经办人员姓名")] public string opterName { get; set; } /// /// 设备唯一标识 /// [Column(Name = "devId", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("设备唯一标识")] public string devId { get; set; } /// /// 设备网络IP /// [Column(Name = "devIP", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("设备网络IP")] public string devIP { get; set; } } /// /// 查询用户一码付状态 - 响应结果 /// public class QuerySignedPayStatusResponse : EntityBase { /// /// 状态标识 /// 0-未签约不可用,1-已签约且可用,2-已签约不可用 /// [Column(Name = "stasFlag", DbType = "VARCHAR2(3)", CanBeNull = false)] [StringLength(3)] [DisplayName("状态标识")] public string stasFlag { get; set; } /// /// 不可用原因 /// 状态异常原因描述,可用于定点医药机构侧识别及展示 /// [Column(Name = "abnRea", DbType = "VARCHAR2(200)", CanBeNull = true)] [StringLength(200)] [DisplayName("不可用原因")] public string abnRea { get; set; } /// /// 支付渠道用户账号名 /// 支付渠道自定义,可用于定点医药机构侧识别及展示 /// [Column(Name = "payChnlUserName", DbType = "VARCHAR2(40)", CanBeNull = true)] [StringLength(40)] [DisplayName("支付渠道用户账号名")] public string payChnlUserName { get; set; } /// /// 支付渠道名称 /// 可用于定点医药机构侧识别支付渠道 /// [Column(Name = "payChnlName", DbType = "VARCHAR2(40)", CanBeNull = true)] [StringLength(40)] [DisplayName("支付渠道名称")] public string payChnlName { get; set; } } /// /// 获取一码付付款凭据请求 /// public class GetPayCertRequest : EntityBase { /// /// 电子凭证令牌 /// [Column(Name = "token", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("电子凭证令牌")] public string token { get; set; } /// /// 现金支付金额 /// [Column(Name = "ownPaySetlAmt", DbType = "VARCHAR2(20)", CanBeNull = false)] [StringLength(20)] [DisplayName("现金支付金额")] public string ownPaySetlAmt { get; set; } /// /// 定点医药机构代码 /// [Column(Name = "orgCodg", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("定点医药机构代码")] public string orgCodg { get; set; } /// /// 定点医药机构名称 /// [Column(Name = "orgName", DbType = "VARCHAR2(200)", CanBeNull = false)] [StringLength(200)] [DisplayName("定点医药机构名称")] public string orgName { get; set; } /// /// 经办人员编号 /// [Column(Name = "opterId", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("经办人员编号")] public string opterId { get; set; } /// /// 经办人员姓名 /// [Column(Name = "opterName", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("经办人员姓名")] public string opterName { get; set; } /// /// 设备唯一标识 /// [Column(Name = "devid", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("设备唯一标识")] public string devId { get; set; } /// /// 设备网络IP /// [Column(Name = "devIP", DbType = "VARCHAR2(40)", CanBeNull = false)] [StringLength(40)] [DisplayName("设备网络IP")] public string devIP { get; set; } /// /// 定点医药机构交易流水号 /// [Column(Name = "fixmedinsTrnsSn", DbType = "VARCHAR2(200)", CanBeNull = false)] [StringLength(200)] [DisplayName("定点医药机构交易流水号")] public string fixmedinsTrnsSn { get; set; } } /// /// 获取一码付付款凭据响应 /// public class GetPayCertResponse:EntityBase { /// /// 付款凭据 /// [Column(Name = "payCert", DbType = "VARCHAR2(2000)", CanBeNull = false)] [StringLength(2000)] [DisplayName("付款凭据")] public string payCert { get; set; } /// /// 支付渠道用户账号名 /// [Column(Name = "payChnlUserName", DbType = "VARCHAR2(400)", CanBeNull = true)] [StringLength(400)] [DisplayName("支付渠道用户账号名")] public string payChnlUserName { get; set; } /// /// 支付渠道名称 /// [Column(Name = "payChnlName", DbType = "VARCHAR2(400)", CanBeNull = true)] [StringLength(400)] [DisplayName("支付渠道名称")] public string payChnlName { get; set; } } }