[0003] 本发明解决的技术问题在于提供一种实现互联网社保支付与现金支付综合收银的方法;解决了互联网模式下门店系统不能直接使用社保机支付或余额不足时不便切换现金支付的问题。
[0005] 所述的方法具体包括如下步骤:一、获取社保局提供的社保支付驱动包,里面有相关的说明文档、dll动态链接库文件及ocx驱动文件;
二、在自定义的浏览器中集成ocx驱动文件与dll动态链接库文件,根据说明文档开发一套支持网页脚本调用的社保支付接口;
三、当用户下载安装专用浏览器时,把ocx驱动文件与dll动态链接库文件下载到用户的系统中,并根据社保机型设定好社保支付时一些必要的参数;
四、在门店系统中依据浏览器中提供的社保接口开发出一套与其交互的社保读取与支付脚本函数;
五、在门店系统中的收银模
块中创建社保与现金综合支付的弹出窗口及开发销售时综合支付的功能,在所述的功能中,首先调用读卡接口,获取用户社保卡上的信息,如果返回的结果中的状态值等为-1,保存社保用户信息;接着调用支付接口,获取支付结果返回信息,如果返回的结果中的状态值等为-1,社保支付完成,否则社保支付失败,进入现金支付环节;
六、在商品资料中依据GSP规定设定好药品的医保属性;
七、依据驱动说明文件,把门店中的社保机改为能够支持互联网访问的模式;
八、销售时弹出支付窗口,根据销售药品的医保属性,进行自动判断,如是医保药品触发支付函数调用,非医保使用现金;
九、用户插入社保卡并输入密码完成支付,否则全部改为现金支付。
[0008] 如图1所示,本发明采用如下步骤:一、获取社保局提供的社保支付驱动包,里面有相关的说明文档、dll动态链接库文件及ocx驱动文件;
二、在自定义的浏览器中集成ocx驱动文件与dll动态链接库文件,根据说明文档开发一套支持网页脚本调用的社保支付接口;如:
1) 调用 DLL 读卡方法
[DllImport("RWCardD.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string RWCardD_ReadCard(bool bYE);
public String ReadCard(bool bYE) {
byte Port = Byte.Parse(ConfigHelper.getValue("
socialSecurityPort"));
byte timeout = Byte.Parse(ConfigHelper.getValue("timeout"));
Int64 btl = Int64.Parse(ConfigHelper.getValue("btl"));
byte jd = Byte.Parse(ConfigHelper.getValue("jd"));
byte sjw = Byte.Parse(ConfigHelper.getValue("sjw"));
byte tzw = Byte.Parse(ConfigHelper.getValue("tzw"));
RWCardD_SetPort(Port);
RWCardD_SetTimeOut(timeout);
RWCardD_SetComm(btl, jd, sjw, tzw);
return RWCardD_ReadCard(bYE);
}
2) 调用 DLL 交易方法
[DllImport("RWCardD.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string RWCardD_BalanceByMoney(string money);
public String Balance(string para){
byte Port = Byte.Parse(ConfigHelper.getValue("
socialSecurityPort"));
byte timeout = Byte.Parse(ConfigHelper.getValue("timeout"));
Int64 btl = Int64.Parse(ConfigHelper.getValue("btl"));
byte jd = Byte.Parse(ConfigHelper.getValue("jd"));
byte sjw = Byte.Parse(ConfigHelper.getValue("sjw"));
byte tzw = Byte.Parse(ConfigHelper.getValue("tzw"));
RWCardD_SetPort(Port);
RWCardD_SetTimeOut(timeout);
RWCardD_SetComm(btl, jd, sjw, tzw);
return RWCardD_Balance(para);
}
三、当用户下载安装专用浏览器时,把ocx驱动文件与dll动态链接库文件下载到用户的系统中,并根据社保机型设定好社保支付时一些必要的参数;
四、在门店系统中依据浏览器中提供的社保接口开发出一套与其交互的社保读取与支付脚本函数;如:
1)读卡
//return 正确返回字符串格式的数据 错误访问01,-1,错误信息
function readCard(){
var result = Cef.ReadCard();
if(result.indexOf("-1") !=-1){
initSocialCard();
result = RWCardXCtrl1.ReadCard(false);
}
return result;
}
2)结算 金额
//money 要求是字符串格式
//return 正确返回字符串格式的数据 错误访问01,-1,错误信息
function balanceByMoney(money){
//只传扣费额度的方式
var result = Cef.BalanceByMoney(money);
if(result.indexOf("-1") !=-1){
initSocialCard();
result = RWCardXCtrl1.BalanceByMoney(money);
}
return result;
}
3)撤销交易 流
水号
//no 要求是字符串格式
//return 正确返回字符串格式的数据 错误访问01,-1,错误信息
function cancelByNo(no){
return Cef.CancelByNo(no)
}
五、在门店系统中的收银模块中创建社保与现金综合支付的弹出窗口及开发销售时综合支付的功能,在所述的功能中,首先调用读卡接口,获取用户社保卡上的信息,如果返回的结果中的状态值等为-1,保存社保用户信息;接着调用支付接口,获取支付结果返回信息,如果返回的结果中的状态值等为-1,社保支付完成,否则社保支付失败,进入现金支付环节;如:
//读取社保
function submitSocialPay() {
try {
var socialPay = $("#socialPay").val();
var payResult = balanceByMoney(parseFloat(socialPay).toFixed(2) + "");
if (payResult && payResult.indexOf("-1") == -1) {
var payResultArr = payResult.split(",");
if (payResultArr && payResultArr.length > 0) {
var socialCardMoney = payResult.split(",")[3];
//如果总的社保金额小于用户帐户金额
if (parseFloat(socialCardMoney) < parseFloat(socialPay)) {
warningMsg("余额不足,不能支付!");
newToken = "";
return false;
}
saveSocialInfo();
} else {
errorMsg("读卡异常,不能支付!");
newToken = "";
return false;
}
} else {
errorMsg("读卡异常,不能支付!");
newToken = "";
return false;
}
} catch (e) {
errorMsg("读卡异常,不能支付!");
newToken = "";
return false;
}
return true;
}
六、在商品资料中依据GSP规定设定好药品的医保属性;如:
//设置医保
$("#btnSetYiBao").click(function () {
setYiBao('${ctx}',0);
});
//取消医保
$("#btnCancelYiBao").click(function () {
setYiBao('${ctx}',1);
});
//具体实现
function setYiBao(rootPath, type, tableId) {
var selRows = null;
if(tableId){
selRows = $(tableId).bootstrapTable("getSelections");
} else {
selRows = $("#table").bootstrapTable("getSelections");
}
if(!selRows || selRows.length == 0) {
warningMsg("请选择要设置医保的商品!");
return;
}
var productIds = [];
for(var i= 0; i
var detail = selRows[i];
productIds[i] = detail.productId;
}
var url = rootPath + '/product/saveAllYiBaoToProduct.action v='+new Date().getTime();
if(type == 1){
url = rootPath + '/product/cancelAllYiBaoToProduct.action v='+new Date().getTime();
}
$.SaveForm({
url : url,
type : "post",
param : productIds,
success : function(data){
if(tableId){
$(tableId).bootstrapTable("refresh");
}else {
$("#table").bootstrapTable("refresh");
}
dialogMsg("操作成功!");
}
})
}
七、依据驱动说明文件,把门店中的社保机改为能够支持互联网访问的模式;
八、销售时弹出支付窗口,根据销售药品的医保属性,进行自动判断,如是医保药品触发支付函数调用,非医保使用现金;如:
function openCheckModal() {
$('#selectPay').find('span:first').addClass('check-select').sibli ngs().removeClass('hide').removeAttr("readonly")
var datas = $("#table").bootstrapTable("getData");
if(!datas || datas.length == 0){
warningMsg("没有消费明细");
return false;
}
var socialPay = 0;
$.each(datas, function (index, obj) {
if(obj.saleCount > obj.stockCount){
warningMsg("(" + obj.productCode + ")销售数量大于库存数量");
return false;
}
if(obj.isYiBao == 1){
socialPay += parseFloat(obj.sellAmount);
}
})
$("#checkModal").iziModal('open');
$("#payAmountBox").show();
$("#returnAmountBox").hide();
$("#checkModal").css("height", "420px");
if (!$('#selectPay').find('span:first').hasClass('check-select')) {
$('#selectPay').find('span:first').addClass('check-select').siblings().removeClass('check-select')
hidePayNum();
payType = 1
}
var payMoney = $("#paymentMoney").text();
//医保赋值
$("#socialPay").val(socialPay); $("#otherPay").val
(fixNumThree(parseFloat(payMoney)-parseFloat(socialPay)));
$("#scost").text(payMoney);
$("#realMoney").val($("#paymentMoney").text());
$("#changeMoney").text("0")
$("#realMoney").focus();
setTimeout(function () {$("#realMoney").select();},100)
}
九、用户插入社保卡并输入密码完成支付,否则全部改为现金支付。如:
function submitSaleOrder() {
//社保支付
if (payType == 5) {
if (!submitSocial()) {
return false;
}
}
//判断付款方式
var realMoney = $("#realMoney").val();
var paymentMoney = $("#paymentMoney").text();
if (!realMoney && realMoney.length == 0) {
if (payType == 1) {
warningMsg("实收款不能为空");
return false;
}
}
if (parseFloat(realMoney) < parseFloat(paymentMoney)) {
warningMsg("实收不能小于应收款");
return false;
}
var datas = $("#table").bootstrapTable("getData");
if (!datas || datas.length == 0) {
warningMsg("无销售明细")
return false;
}
//初始化明细
var detailDatas = initSaleDetailDatas(datas);
//初始化支付订单
var salePayOrders = [{
"payMoney": paymentMoney,
"changeMoney": $("#changeMoney").val(),
"realMoney": realMoney,
"authCode": $("#authCode").val(),
"payType": payType,
"seller": $("#sellerInfo").find("option:selected").text()
}];
//传递的参数
var param = initSaleOrder(detailDatas, salePayOrders);
function saveOrder(
//提交表单
$.SaveForms({
url: rootPath + "/submitSaleOrder.action v=${version}",
param: param,
success: function (json) {
showSuccMsg("支付成功");
}
});
} 。