prompt 统一支付平台his内部过程(易惠统一支付平台) create or replace procedure SP_SF_PAY_ZFRZ00( PJKLXBH in number ,--输入:接口类型编号 0:设置服务 1:查询预交金 2:预交金充值 3:预交金退款 4:查询交易结果 PBRID00 in number ,--输入:BRID00 PZYGHID in number ,--输入:住院(ZYID00)或门诊(GHID000)流水号 PZYHGHH in varchar2 ,--输入:住院(ZYH000)或门诊(GHH000)号 PCZY000 in number ,--输入:操作员编码 PCZYXM0 in varchar2 ,--输入:病人姓名 PMZZYBZ in varchar2 ,--输入:门诊住院标志 0:门诊 1:住院 PJFBZ00 in varchar2 ,--输入:缴费备注0:交,1:退 PJZDH00 in number default 0 ,--输入:结账单号 PYJDH00 in number default 0 ,--输入:医技单号 PZFFS00 in number ,--输入:支付编码 PZFFSMC in varchar2 ,--输入:支付名称 PJFJE00 in number ,--输入:缴费金额 PFKTM00 in varchar2 default '' ,--输入:付款条码 PTKDDH0 in varchar2 default '' ,--输入:退款订单号 PINCS00 in varchar2 ,--输入:输入参数(票据序号|开户银行|转账单位|支票号码) PCOMMIT in varchar2 default 'N' ,--输入:是否提交事务 Y:提交 N:不提交 PZXZT00 out number ,--输出:执行状态 0:失败 1:成功 PDDLSH0 out varchar2 ,--输出:订单流水号 PERRMSG out varchar2 --输出:错误信息 ) as -- MODIFICATION HISTORY -- Person Date Comments --zhangyc 2017.07.31 created by MZSF-20170724-004 --zhangyc 2017.08.14 by MZSF-20170815-001 --zhangyc 2017.09.30 微信或支付宝支付修改 by MZSF-20171010-001 --zhangyc 2017.10.12 微信或支付修正 by MZSF-20171012-002 --zhangyc 2017.10.18 统一支付修正 by MZSF-20171018-002 --zhangyc 2017.10.26 修正建档登记缴费备注错误导致判断异常 by MZSF-20171027-002 --zhangyc 2017.11.06 增加SF_YJJYHKJYHXZ、SF_YJJZZZPHMXZ 判断 by MZSF-20171107-001 -- --------- ---------- ------- RBRXX BM_BRXXB0%rowtype; RZYXX ZY_BRXXB0%rowtype; LS_COUNT0 number(5); LS_CZRQ00 char(8); LS_CZSJ00 char(8); LS_TRANSTYPE varchar2(50);--接口名称 LS_YYID00 varchar2(6); LS_ICKH00 IC_YHXX00.ICKH00%type; LS_KLDH00 IC_YHXX00.KLDH00%type; LS_KMH000 IC_YHXX00.KMH000%type; LS_ICKNBH IC_YHXX00.ICKNBH%type; LS_ICKSX0 IC_YHXX00.ICKSX0%type; LS_DDLSH0 BM_ZFRZ00.DDLSH0%type; LS_MZZHID SF_BRZHXX.MZZHID%type; LS_SFDJ00 SF_BRZHXX.SFDJ00%type; LS_ZYE000 SF_BRZHXX.ZYE000%type; LS_XJYE00 SF_BRZHXX.XJYE00%type; LS_ZZYE00 SF_BRZHXX.ZZYE00%type; LS_YKTYE0 SF_BRZHXX.YKTYE0%type; LS_CARDTYPE varchar2(10);--01社保卡 02市民健康卡 03院内就诊卡 04身份证 05住院病案号 06临时卡 07腕带编码 LS_CARDNO varchar2(200);--去前缀卡号 LS_ACCOUNTTYPE varchar2(10);--帐户类型 01:门诊账户 02:住院账户 LS_HISCUSTID number(12); --院内ID、门诊或住院ID LS_CZFSBM varchar2(30);--充值方式编码 LS_CZFSMC varchar2(50);--充值方式名称 LS_AMOUNT number(12,2); LS_AMOUNT_MC varchar2(30); LS_PJXH00 SF_PJSYQK.PJXH00%type; LS_PJLYID BM_PJLYQK.PJLYID%type; LS_WITHDRAWMODE varchar2(10); --退款方式:0:现金 1:原路退回 2:银企退款 3:医保自费部份退款 4:离线POS 5:单位转账 LS_ERRSTR varchar2(200); LS_OUTCHARGENO varchar2(50); LS_TYJE00 number(12,2); LS_JFBZ00 char(1); LS_HZJDFLAG char(1);--是否建档标志 1:是 0:否 begin LS_ERRSTR:=''; PZXZT00:=0; --执行状态 0:失败 1:成功 PDDLSH0:=''; LS_CZRQ00:=to_char(sysdate,'YYYYMMDD'); LS_CZSJ00:=to_char(sysdate,'HH24:MI:SS'); LS_TYJE00:=0; LS_JFBZ00:=PJFBZ00;--缴费备注0:交,1:退 --接口类型编号 0:设置服务 1:查询预交金 2:预交金充值 3:预交金退款 4:查询交易结果 if PJKLXBH in (2) and LS_JFBZ00 not in ('0') then LS_JFBZ00:='0'; --缴费备注 0:交 1:退 end if; if PJKLXBH in (3) and LS_JFBZ00 not in ('1') then LS_JFBZ00:='1'; --缴费备注 0:交 1:退 end if; --退款方式:0:现金 1:原路退回 2:银企退款 3:医保自费部份退款 4:离线POS 5:单位转账 if PZFFS00=1 then LS_WITHDRAWMODE:='0'; elsif PZFFS00=2 then LS_WITHDRAWMODE:='5'; elsif PZFFS00=8 then LS_WITHDRAWMODE:='4'; elsif PZFFS00=24 then LS_WITHDRAWMODE:='1'; elsif PZFFS00=25 then LS_WITHDRAWMODE:='1'; else LS_WITHDRAWMODE:='0'; end if; --获取医院ID begin select SF_SF_GETYYID00() YYID00 into LS_YYID00 from dual; exception when others then LS_YYID00:='0'; end; --数据统一校验 SP_SF_PAY_CHECK ( PBRID00,--病人ID PCZY000,--操作员 PZFFS00,--支付方式 PMZZYBZ,--门诊住院标志 0:门诊 1:住院 LS_JFBZ00,--缴费备注 0:交 1:退 PJFJE00,--交易金额 PINCS00,--其他参数 LS_ERRSTR--错误信息 ); if trim(LS_ERRSTR) is not null then PERRMSG:=LS_ERRSTR; return; end if; select SF_SF_PAY_DDLSH0('',PMZZYBZ) into LS_DDLSH0 from dual; select * into RBRXX from BM_BRXXB0 where BRID00=PBRID00; if PMZZYBZ in ('0') then --门诊住院标志 0:门诊 1:住院 begin select ICKH00,KLDH00,KMH000,ICKNBH,ICKSX0 into LS_ICKH00,LS_KLDH00,LS_KMH000,LS_ICKNBH,LS_ICKSX0 from IC_YHXX00 where BRID00=PBRID00 and ZT0000='1'; exception when others then LS_ICKH00:=null; end; select SF_SF_MSTCARDNO(PBRID00,'5.0',trim(LS_ICKH00),trim(LS_KLDH00),trim(LS_ICKSX0),trim(LS_ICKNBH),trim(LS_KMH000)) into LS_CARDNO from dual; --9位:社保卡 10位:居民健康卡 if length(LS_CARDNO) in (9,12) then LS_CARDTYPE:='01'; elsif length(LS_CARDNO) in (10) then LS_CARDTYPE:='02'; else LS_CARDTYPE:='03'; end if; --LS_CARDTYPE:='05';--测试用 LS_ACCOUNTTYPE:='01';--帐户类型 01:门诊账户 02:住院账户 LS_HISCUSTID:=PBRID00; --院内ID、门诊或住院ID else --住院 select * into RZYXX from ZY_BRXXB0 where ZYID00=PZYGHID; LS_CARDTYPE:='05'; LS_ACCOUNTTYPE:='02';--帐户类型 01:门诊账户 02:住院账户 LS_HISCUSTID:=PZYGHID; --院内ID、门诊或住院ID end if; --获取充值或退款方式SF_SF_PAY_CZFS00(缴费备注 0:交 1:退,返回类型 0:院内 1:平台,返回编码类型 0:编码 1:名称,支付方式编码) select SF_SF_PAY_CZFS00(LS_JFBZ00,'0','0',PZFFS00) into LS_CZFSBM from dual; --充值或退款方式编码 select SF_SF_PAY_CZFS00(LS_JFBZ00,'0','1',PZFFS00) into LS_CZFSMC from dual; --充值或退款方式名称 if LS_CZFSBM is null then PERRMSG:='充值或退款方式不能为空'; return; end if; if LS_JFBZ00 in ('0') then --:缴费备注0:交,1:退 LS_AMOUNT:=PJFJE00; LS_AMOUNT_MC:='充值金额'; else --:缴费备注,1:退 LS_AMOUNT:=abs(PJFJE00); LS_AMOUNT_MC:='退款金额'; end if; select SF_SF_GETBRZHYE(0,PBRID00,1,3) into LS_TYJE00 from dual; --插入日志主表 insert into BM_ZFRZ00 ( DDLSH0,--订单流水号((门诊MZ 住院ZY 自助机:ZZ)+yyyyMMddHHmmss+xxxx) CZRQ00,--操作日期 CZSJ00,--操作时间 CZY000,--操作员编码 CZYXM0,--操作员姓名 JKLXBH,--接口类型编号 0:设置服务 1:查询预交金 2:预交金充值 3:预交金退款 4:查询交易结果 JKLXMC,--接口类型名称 ZDBH00,--终端编号(自助机) BRID00,--病人ID BRXM00,--病人姓名 BRXB00,--病人性别 YBKH00,--医保卡号 YBID00,--医保ID ICKH00,--IC卡号 BRZJBH,--证件编号 BRDH00,--病人电话 MZZYBZ,--门诊住院标志 0:门诊 1:住院 JFBZ00,--缴费备注0:交,1:退 ZYGHID,--住院(ZYID00)或门诊(GHID000)流水号 ZYHGHH,--住院(ZYH000)或门诊(GHH000)号 JZDH00,--结账单号 YJDH00,--医技单号 ZFFS00,--支付编码 ZFFSMC,--支付方式名称 DJH000,--单据流水号=SF_BRJFB0.DJH000 JFJE00,--缴费金额 JFRQ00,--缴费日期 JFSJ00,--缴费时间 ZXZTBZ,--状态标志 0:失败 1:成功 BRYE00,--病人余额 BZ0000,--备注信息 PTDDH0,--支付平台充值订单号=chargeNo,退款订单号=refundNo ZFQD00,--支付渠道=tradeMode JYCGSJ,--交易成功时间(yyyyMMddHHmmss)=traceTime PTGZH0,--支付平台跟踪号=traceNo JKXYBM,--响应编码=respCode JKXYXX,--响应信息=respMsg JYLSH0,--交易流水号 YKTSH0,--健康通流水号 JYLXMC,--交易类型名称 JGBM00,--机构编码 JGMC00,--机构名称 INCS00,--请求入参集合=param INQTCS,--扩展入参集合 OUTCS0,--返回参数 TKDDH0,--商户退款订单号=outRefundNo TKJE00, --退款金额 TYJE00 --停用金额 )values ( LS_DDLSH0,--订单流水号((门诊MZ 住院ZY 自助机:ZZ)+yyyyMMddHHmmss+xxxx) LS_CZRQ00,--操作日期 LS_CZSJ00,--操作时间 PCZY000,--操作员编码 PCZYXM0,--操作员姓名 PJKLXBH,--接口类型编号 0:设置服务 1:查询预交金 2:预交金充值 3:预交金退款 4:查询交易结果 SF_SF_PAY_JKLXMC(PJKLXBH,0),--接口类型名称 '',--终端编号(自助机) RBRXX.BRID00,--病人ID trim(RBRXX.BRXM00),--病人姓名 RBRXX.BRXB00,--病人性别 trim(RBRXX.YBKH00),--医保卡号 trim(RBRXX.YBID00),--医保ID trim(LS_ICKH00),--IC卡号 trim(RBRXX.BRZJBH),--证件编号 trim(RBRXX.BRDH00),--病人电话 PMZZYBZ,--门诊住院标志 0:门诊 1:住院 LS_JFBZ00,--缴费备注0:交,1:退 PZYGHID,--住院(ZYID00)或门诊(GHID000)流水号 PZYHGHH,--住院(ZYH000)或门诊(GHH000)号 PJZDH00,--结账单号 PYJDH00,--医技单号 PZFFS00,--支付编码 PZFFSMC,--支付方式名称 0,--单据流水号=SF_BRJFB0.DJH000 PJFJE00,--缴费金额 null,--缴费日期 null,--缴费时间 '0',--状态标志 0:失败 1:成功 0,--病人余额 null,--备注信息 null,--支付平台充值订单号=chargeNo,退款订单号=refundNo null,--支付渠道=tradeMode null,--交易成功时间(yyyyMMddHHmmss)=traceTime null,--支付平台跟踪号=traceNo null,--响应编码=respCode null,--响应信息=respMsg null,--交易流水号 null,--健康通流水号 null,--交易类型名称 null,--机构编码 '易联众医院统一支付平台',--机构名称 null,--请求入参集合=param PINCS00,--扩展入参集合 null,--返回参数 PTKDDH0,--商户退款订单号 0, LS_TYJE00 ); --插入接口名称---begin--- /* transType hop.trade.setinfo 设置服务参数 hop.account.info 查询预交金账户信息 hop.trade.recharge 预交金账户充值 hop.trade.refund 预交金账户退款 hop.trade.query 交易结果查询 */ select SF_SF_PAY_JKLXMC(PJKLXBH,0) into LS_TRANSTYPE from dual; insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'主项参数','transType','接口名称',LS_TRANSTYPE,null); --插入接口名称---end--- --插入param--begin-- if PJKLXBH in (2,3) then --接口类型编号 0:设置服务 1:查询预交金 2:预交金充值 3:预交金退款 4:查询交易结果 --HZJDFlag 是否门诊建档 1:0:否 if PZYHGHH in ('门诊建档') then LS_HZJDFLAG:='1'; else LS_HZJDFLAG:='0'; end if; insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','HZJDFlag','是否建档 1:是否 0:否',LS_HZJDFLAG,null); --operatorId Char(30) N 操作员编号 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','operatorId','操作员编号',PCZY000,null); --operatorName Char(50) N 操作员姓名 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','operatorName','操作员姓名',PCZYXM0,null); --termNo 终端编号 Char(52) insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','termNo','终端编号',null,null); --cardType Char(2) N 卡类型 01社保卡 02市民健康卡 03院内就诊卡 04身份证 05住院病案号 06临时卡 07腕带编码 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','cardType','卡类型',trim(LS_CARDTYPE),null); --cardNo Char(32) N 卡号 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','cardNo','卡号',trim(LS_CARDNO),null); --accountType 帐户类型 String(2) 01:门诊账户 02:住院账户 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','accountType','帐户类型',trim(LS_ACCOUNTTYPE),null); --hisCustId 院内ID String(2) N 门诊或住院ID insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','hisCustId','门诊或住院ID',LS_HISCUSTID,null); --idNo 身份证号 String(32) Y insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','idNo','身份证号',trim(RBRXX.BRZJBH),null); --userName Char(64) N 姓名 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','userName','病人姓名',trim(RBRXX.BRXM00),null); --depositType 充值方式 String(12) insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','depositType',trim(LS_CZFSMC),trim(LS_CZFSBM),null); --amount 充值金额 Number(12,2) N insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','amount',trim(LS_AMOUNT_MC),trim(to_char(round(LS_AMOUNT,2),'9999999990.00')),null); if PJKLXBH in (2) then --outChargeNo 商户充值业务流水 String(30) insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','outChargeNo','商户订单流水号',LS_DDLSH0,null); end if; if PJKLXBH in (3) then --接口类型编号 3:预交金退款 退款方式:0:现金 1:原路退回 2:银企退款 3:医保自费部份退款 4:离线POS 5:单位转账 --outChargeNo 商户充值业务流水 String(30) if PTKDDH0 is null then LS_OUTCHARGENO:=LS_DDLSH0; else LS_OUTCHARGENO:=PTKDDH0; end if; insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','outChargeNo','商户订单流水号',LS_OUTCHARGENO,null); --原订单流水号 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','withdrawMode','退款方式',LS_WITHDRAWMODE,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','outRefundNo','商户退款订单号',LS_DDLSH0,null); --新订单流水号 insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'param','channelType','原充值交易的渠道类型','01',null); end if; --插入扩展参数extra--begin-- if PJKLXBH in (2) then insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','openId','微信公共号支付需入参openId',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','authCode','微信刷卡支付需入参authCode',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','returnUrl','支付成功页面中转URL',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','buyerId','支付宝服务窗支付需要入参买家的支付宝唯一用户号',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','buyerLogonId','支付宝服务窗支付需要入参买家支付宝账号',null,null); else insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','userName','提现人姓名',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','contactNumber','提现人联系电话',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','ubankNo','联行号',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','bankCardNo','提现银行卡号',null,null); insert into BM_ZFRZMX(DDLSH0,MXID00,CSLXMC,ZDBM00,ZDSM00,VALUE0,BZSM00) values(LS_DDLSH0,SQ_BM_ZFRZMX_MXID00.nextval,'extra','branchName','提现账户开户行名称',null,null); end if; --插入扩展参数extra--end-- end if; --插入param--end-- if PCOMMIT='Y' then commit; end if; PZXZT00:=1;--输出:执行状态 0:失败 1:成功 PDDLSH0:=LS_DDLSH0;--输出:订单流水号 exception when no_data_found then PZXZT00:=0; PERRMSG:=substrb('执行过程SP_SF_PAY_ZFRZ00错误!'||sqlerrm,1,200); when others then PZXZT00:=0; PERRMSG:=substrb('执行过程SP_SF_PAY_ZFRZ00错误!'||sqlerrm,1,200); end; / show error; --%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%