package com.ynxbd.ali.helper; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayClient; import com.alipay.api.domain.CommerceAppUploadRequestContent; import com.alipay.api.request.AlipayCommerceAppAuthUploadRequest; import com.alipay.api.request.AlipayEcoCityserviceCityserviceEnergySendRequest; import com.alipay.api.response.AlipayCommerceAppAuthUploadResponse; import com.alipay.api.response.AlipayEcoCityserviceCityserviceEnergySendResponse; import com.ynxbd.ali.config.AliConfig; import com.ynxbd.ali.enums.AliEnergyEnum; import com.ynxbd.ali.enums.AliMsgEnum; import com.ynxbd.common.bean.Patient; import com.ynxbd.common.helper.common.DateHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.result.ServiceException; import com.ynxbd.common.service.PatientService; import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.UUID; @Slf4j public class AliMessageHelper { /** * 挂号推送 */ public static void hospitalOrder(String openid, String title, AliMsgEnum msgEnum, Date createOrderTime, boolean isCreate, BigDecimal totalFee, String outTradeNo, String regDate, String regTime, String deptCode, String deptName, String doctName, String link) { if (!AliConfig.IS_PUSH_MSG) { return; } if (!AliHelper.isAliUser(openid)) { return; } String accessToken = AliCacheHelper.getHospAccessToken(openid); if (accessToken == null) { log.error("[支付宝]消息推送 accessToken为空"); return; } Patient patient = new PatientService().getMyself(openid); if (patient == null || patient.getName() == null) { log.error("[支付宝]消息推送 trueName为空"); return; } String trueName = patient.getName(); if (totalFee == null) { log.error("[支付宝]消息推送 totalFee为空"); return; } if (createOrderTime == null) { log.error("[支付宝]消息推送 createOrderTime为空"); return; } String createOrderTimeStr = DateHelper.dateToStr(createOrderTime, DateHelper.DateEnum.yyyy_MM_dd_HH_mm_ss); if (createOrderTimeStr == null) { log.error("[支付宝]消息推送 日期转换失败"); return; } String updateOrderTime = isCreate ? DateHelper.getMoveSeconds(createOrderTimeStr, 2L) : DateHelper.getMoveSeconds(DateHelper.getCurDateTime(), -6L); String totalFeeStr = totalFee.setScale(2, RoundingMode.DOWN).toString(); AlipayCommerceAppAuthUploadRequest request = new AlipayCommerceAppAuthUploadRequest(); request.setServiceName("alipay.commerce.app.data"); //应用服务名称 固定值 String(256) 不可空 request.setTargetId(AliConfig.HOSP_ID); // 目标用户 String(64) 签约商家 PID 不可空 CommerceAppUploadRequestContent content = new CommerceAppUploadRequestContent(); //服务数据参数 content.setTenantAppId(AliConfig.TENANT_APP_ID); // 租户应用ID String(64) 支付宝分配不可空 content.setActivityId("upload_hospital_order"); // 业务流程ID String(64) 不可空 此处固定为“upload_hospital_order” JSONObject json_body = new JSONObject(); // 业务流程参数 String(6000) 业务流程请求参数说明 json_body.put("out_biz_no", outTradeNo); // 医院预约单订单号 唯一不重复(同一 家 ISV 接入的所有 医院的挂号单、检 查号、医药单都不 可重复) String(128) json_body.put("partner_id", AliConfig.ISV_PARTNER_ID); // ISV的PID,支付宝id(2088 开头)。同一家ISV 请保持一致! json_body.put("tiny_app_id", AliConfig.APP_ID); // 医院在支付宝的小程序id json_body.put("buyer_id", openid); // 就诊人 id,授权人id 就诊人在支付宝平 台的 2088 开头 16 位id json_body.put("order_create_time", createOrderTimeStr); // 订单创建时间 json_body.put("order_modified_time", updateOrderTime); // 订单修改时间-后移5min(小于当前时间会报错) json_body.put("amount", totalFeeStr); //订单金额 json_body.put("pay_amount", totalFeeStr); //支付金额 // json_body.put("trade_no", tradeNo);//支付宝交易号 json_body.put("order_type", "HOSPITAL_ORDER"); // 固定为 HOSPITAL_ORDER json_body.put("out_biz_type", "HOSPITAL_APPOINTMENT"); // 固定值 HOSPITAL_APPOINTMENT json_body.put("merchant_order_status", msgEnum.CODE); // 状态 String(64) 枚举详见文档 JSONArray item_order_list = new JSONArray(); JSONObject item_order = new JSONObject(); item_order.put("item_name", title);//商品名称 item_order.put("quantity", "1"); //商品数量 item_order.put("sku_id", "1"); // 商品 skuId item_order.put("unit_price", totalFeeStr); //商品单价 item_order_list.add(item_order); json_body.put("item_order_list", item_order_list); JSONObject ext_info = new JSONObject(); ext_info.put("hospital", AliConfig.HOSP_NAME); //医院名称 ext_info.put("hospital_register_id", AliConfig.HOSP_REGISTER_ID); // 医院登记号 ext_info.put("department", deptName); //就诊科室 ext_info.put("dept_num", deptCode); //诊室编号 ext_info.put("dept_loc", "暂无");//科室位置 // ext_info.put("navigation", "导航地址");//导航地址 ext_info.put("doctor", doctName); //医生名称 // ext_info.put("doctor_rank", "医生职级"); //医生职级 // ext_info.put("doctor_id", "医生 id");//医生 id // ext_info.put("doctor_avatar", "医生头像 url");//医生头像 url ext_info.put("patient", trueName); // 就诊人 必须与 buy_id 对 应的姓名一致 if ((DateHelper.isToday(regDate))) { // 今日挂号 if (regTime == null) { ext_info.put("scheduled_time", DateHelper.getMoveMinute(DateHelper.getCurDateTime(), 10)); } else { if (DateHelper.isCurTimeOver(regTime)) { // 2 regTime = DateHelper.getMoveMinute(DateHelper.getCurDateTime(), 2); } else { String moveDateTime = DateHelper.getMoveMinute(DateHelper.getCurDateTime(), 2); regTime = Boolean.TRUE.equals(DateHelper.isDateTimeOver(moveDateTime, regTime)) ? moveDateTime : DateHelper.getCurDate() + " " + regTime; } ext_info.put("scheduled_time", regTime); } } else { ext_info.put("scheduled_time", regDate + " " + (regTime == null ? "00:00:00" : regTime)); // 预约时间 } // ext_info.put("take_num_url", "取号入口URL"); // 取号入口 // ext_info.put("take_num_password", "取号密码"); // 取号密码 // ext_info.put("call_num_url", "叫号进度入口"); // 叫号进度入口 // ext_info.put("medical_order_id", "就诊单 id"); // 就诊单id // ext_info.put("medical_num", "就诊/检 查序号"); // 就诊/检 查序号 // ext_info.put("merchant_order_link_page", "订单链接"); // 订单链接 ext_info.put("merchant_order_link_page", link); // 订单链接 json_body.put("ext_info", ext_info); content.setBody(JSONObject.toJSONString(json_body)); request.setContent(content); log.info("[支付宝-消息推送]入参 accessToken={}, {}", accessToken, JSONObject.toJSONString(request)); AlipayClient alipayClient = AliHelper.getAliClient(); try { AlipayCommerceAppAuthUploadResponse response = alipayClient.execute(request, accessToken); if (!response.isSuccess()) { log.error("[支付宝]消息推送是失败 code={}, msg={}, subMsg={}", response.getCode(), response.getMsg(), response.getSubMsg()); } else { log.info("[支付宝]消息推送成功 code={}, resp={}", response.getCode(), JsonHelper.toJsonString(response.getData())); } } catch (Exception e) { e.printStackTrace(); } } /** * 发送能量 * * @param openid 唯一id */ public static boolean sendEnergy(String openid, AliEnergyEnum energyEnum) throws ServiceException { if (!AliConfig.IS_PUSH_MSG) { throw new ServiceException("[支付宝-能量]功能未开通"); } if (!AliHelper.isAliUser(openid)) { // 不是支付宝用户|openid为空 throw new ServiceException("[支付宝-能量]用户id错误"); } String accessToken = AliCacheHelper.getEnergyAccessToken(openid); if (accessToken == null) { throw new ServiceException("[支付宝-能量]授权码缺失"); } JSONObject reqJson = new JSONObject(); reqJson.put("scene", energyEnum.CODE); // 场景 reqJson.put("outer_no", UUID.randomUUID().toString().replace("-", "")); JSONObject extInfoJson = new JSONObject(); extInfoJson.put("ext_key", "ITEM_TYPE"); extInfoJson.put("ext_value", "book"); reqJson.put("ext_info", extInfoJson); AlipayClient alipayClient = AliHelper.getAliClient(); AlipayEcoCityserviceCityserviceEnergySendRequest request = new AlipayEcoCityserviceCityserviceEnergySendRequest(); request.setBizContent(JsonHelper.toJsonString(reqJson)); try { AlipayEcoCityserviceCityserviceEnergySendResponse response = alipayClient.execute(request, accessToken); if (!response.isSuccess()) { log.error("[支付宝-能量]发送失败 code={}, message={}, accessToken={}", response.getCode(), response.getMsg(), accessToken); throw new ServiceException("[支付宝-能量]发送失败[" + response.getCode() + "]" + response.getMsg()); } log.info("[支付宝-能量]发送成功"); } catch (Exception e) { throw new ServiceException(e.getMessage()); } return true; } }