Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

304 řádky
11 KiB

  1. <?php
  2. namespace backend\modules\api\logic;
  3. use backend\modules\api\models\OrderMain;
  4. use backend\modules\api\util\Util;
  5. use common\util\CurlInterface;
  6. class Sunshine
  7. {
  8. private $apiPath = [
  9. 'VerifyOrder' => '/sinosig_web/SyncInterface',
  10. 'CreateOrder' => '/sinosig_web/SyncInterface',
  11. 'CancelOrder' => '/sinosig_web/SyncInterface',
  12. ];
  13. private $sunshineConfig = null;
  14. private function sunshineConfig()
  15. {
  16. if ($this->sunshineConfig == null) {
  17. $this->sunshineConfig = \Yii::$app->params['sunshine_config'];
  18. }
  19. return $this->sunshineConfig;
  20. }
  21. /**
  22. * Function Description:阳光保险下单验证接口
  23. * Function Name: VerifyOrder
  24. * @param $par
  25. * @return array
  26. * @author fuhc
  27. */
  28. public function VerifyOrder($par)
  29. {
  30. $params = $this->getHttpParam($par);
  31. $resp = $this->sendCurl($params,'UNDERWRITE','VerifyOrder');
  32. if (!empty($resp['ORDER']['@attributes']['RETURN'])) {
  33. if($resp['ORDER']['@attributes']['RETURN']=='true'){
  34. return Util::returnArrSu('允许下单', $resp, '');
  35. }
  36. }
  37. return Util::returnArrEr('不允许下单', $resp, 'Sun-Verify-Order-Error');
  38. }
  39. /**
  40. * Function Description:阳光保险下单
  41. * Function Name: CreateOrder
  42. * @param $par
  43. * @return array
  44. * @author fuhc
  45. */
  46. public function CreateOrder($par)
  47. {
  48. $params = $this->getHttpParam($par);
  49. $resp = $this->sendCurl($params,'INSURE','CreateOrder');
  50. if (!empty($resp['ORDER']['@attributes']['RETURN'])) {
  51. if($resp['ORDER']['@attributes']['RETURN']=='true'){
  52. //获取保单号
  53. $POLICYNO = '';
  54. if(!empty($resp['ORDER']['POLICY']['@attributes']['POLICYNO'])){
  55. $POLICYNO = $resp['ORDER']['POLICY']['@attributes']['POLICYNO'];
  56. }
  57. $data = [];
  58. $data['policyno'] = $POLICYNO;
  59. $orderMain = new OrderMain();
  60. $result=$orderMain->updateInsuranceNo(['policyno'=>$POLICYNO,'order_id'=>$params['ORDER']['ORDERID']]);
  61. if($result===false){
  62. //失败
  63. }else{
  64. //成功
  65. }
  66. return Util::returnArrSu('下单成功', $data, '');
  67. }
  68. }
  69. return Util::returnArrEr('下单失败:', $resp, 'Sun-Create-Order-Error');
  70. }
  71. /**
  72. * Function Description:阳光保险退保
  73. * Function Name: CancelOrder
  74. * @param $params
  75. * @return array
  76. * @author fuhc
  77. */
  78. public function CancelOrder($params)
  79. {
  80. $resp = $this->sendCurl($params,'SURRENDER','CancelOrder');
  81. if (!empty($resp['ORDER']['@attributes']['RETURN'])) {
  82. if($resp['ORDER']['@attributes']['RETURN']=='true'){
  83. //获取保单号
  84. $POLICYNO = '';
  85. $data = [];
  86. if(!empty($resp['ORDER']['POLICY']['@attributes']['POLICYNO'])){
  87. $POLICYNO = $resp['ORDER']['POLICY']['@attributes']['POLICYNO'];
  88. $data['policyno'] = $POLICYNO;
  89. }else{
  90. return Util::returnArrSu('取消成功-保单号获取失败:', $data, 'Sun-Cancel-Order-Error01');
  91. }
  92. return Util::returnArrSu('取消成功', $data, '');
  93. }
  94. }
  95. return Util::returnArrEr('取消失败:', $resp, 'Sun-Cancel-Order-Error02');
  96. }
  97. /**
  98. * Function Description:下载保单
  99. * Function Name: EInsuranceForm
  100. * @param $params
  101. * @return array
  102. * @author fuhc
  103. */
  104. public function EInsuranceForm($params){
  105. $resp = $this->sendCurl($params,'EPOLICY','CancelOrder');
  106. if (!empty($resp['ORDER']['@attributes']['RETURN'])) {
  107. if($resp['ORDER']['@attributes']['RETURN']=='true'){
  108. return Util::returnArrSu('保单信息成功', $resp, '');
  109. }
  110. }
  111. return Util::returnArrEr('保单信息失败', $resp, 'Sun-E-InsuranceForm-Error01');
  112. }
  113. /*
  114. * 发送curl
  115. */
  116. private function sendCurl($params,$functionFlag,$apiPathKey){
  117. $httpBody = $this->setRequest($params, $functionFlag);
  118. $httpBody = http_build_query($httpBody);
  119. $curl = new CurlInterface($httpBody, 3);
  120. $sunshineConfig = $this->sunshineConfig();
  121. $api = $sunshineConfig['api'] . $this->apiPath[$apiPathKey];
  122. $curl->setHeader('Content-Type: application/x-www-form-urlencoded');
  123. $resp = $curl->execute($api, 'POST');
  124. return $resp;
  125. }
  126. /**
  127. * Des:设置传输报文
  128. * Name: setRequest
  129. * @param array $data
  130. * @param string $functionFlag
  131. * @return array
  132. * @author 倪宗锋
  133. */
  134. private function setRequest($data = [], $functionFlag = '')
  135. {
  136. $sunshineConfig = $this->sunshineConfig();
  137. $data['USERNAME'] = $sunshineConfig['username'];
  138. $data['PASSWORD'] = $sunshineConfig['password'];
  139. $param = [];
  140. $param['data'] = '<?xml version="1.0" encoding="GBK"?>' . Util::arrayToXml(['INSURENCEINFO' => $data]);
  141. $param['data'] = iconv('UTF-8', 'GBK', $param['data']);
  142. $param['sign'] = $this->setSign($param['data']);
  143. $param['functionFlag'] = $functionFlag;
  144. $param['interfaceFlag'] = 'JSHH';
  145. return $param;
  146. }
  147. /**
  148. * Des:设置加密函数
  149. * Name: setSign
  150. * @param $body
  151. * @return string
  152. * @author 倪宗锋
  153. */
  154. private function setSign($body)
  155. {
  156. $sunshineConfig = $this->sunshineConfig();
  157. $signString = $sunshineConfig['signkey'];
  158. $signString .= $body;
  159. return md5($signString);
  160. }
  161. /*
  162. * 获取请求参数
  163. */
  164. private function getHttpParam($par){
  165. $sunshineConfig = $this->sunshineConfig();
  166. $cardInfo = Util::getIDCardInfo($par['passenger_cardid']);
  167. $cardInfo_policy_holder = Util::getIDCardInfo($par['policy_holder_cardid']); //投保人身份证信息
  168. //联系人信息
  169. $CONTACTINFO = [];
  170. $CONTACTINFO['CONTACTNAME'] = $par['contacts_name']; //联系人姓名 必须
  171. $CONTACTINFO['CONTACTMOBILE'] = $par['contacts_phone']; //联系人手机号 必须
  172. $CONTACTINFO['CONTACTPHONE'] = $par['contacts_phone']; //联系人备用电话
  173. $CONTACTINFO['CONTACTEMAIL'] = ''; //联系人邮箱
  174. //INSURED
  175. $INSURED = [];
  176. $obj = [];
  177. $obj['INSUREDNAME'] = $par['passenger_name']; //被保人姓名
  178. $relationship = '';
  179. //投保人必须年满18周岁
  180. // 被保人小于10岁,投保人必须是父母
  181. // 被保人10-18岁,投保人必须是父母或具有赡养义务等关系的
  182. if($cardInfo['old']<18){
  183. $relationship = '62';
  184. }else{
  185. //大于=18岁 关系为本人 则投保人信息为被保人信息
  186. $par['policy_holder_name'] = $par['passenger_name'];
  187. $par['policy_holder_cardid'] = $par['passenger_cardid'];
  188. $cardInfo_policy_holder = $cardInfo;
  189. $relationship = '10';
  190. }
  191. $obj['RELATIONSHIP'] = $relationship; //投保人与被保人关系 10: 本人 62: 父母 99:其他
  192. $obj['INSUREDSEX'] = $cardInfo['sex']=='男'?'1':'2'; //被保人性别 性别为固定值:1:男;2:女
  193. $obj['INSUREDBIRTHDAY'] = $cardInfo['birthday']; //被保人出生日期 日期格式:yyyy-MM-dd
  194. $obj['INSUREDIDNO'] = $par['passenger_cardid']; //被保人证件号码
  195. $obj['INSUREDIDTYPE'] = '10'; //被保人证件类型
  196. $obj['INSUREDMOBILE'] = $par['contacts_phone']; //被保人手机号
  197. $obj['COUNTRY'] = 'CHN'; //国家
  198. $INSURED[]=$obj;
  199. $INSUREDLIST = [];
  200. $INSUREDLIST['INSURED'] = $INSURED;
  201. //POLICYINFO
  202. $POLICYINFO = [];
  203. $POLICYINFO['INSURSTARTDATE'] = $par['start_date'].' '.$par['start_time']; //客户指定的保险起期:格式yyyy-MM-dd HH:mm:ss
  204. $t_t = strtotime('+1 day',strtotime($POLICYINFO['INSURSTARTDATE'])-1); //客户指定的保险止期:格式yyyy-MM-dd HH:mm:ss
  205. $POLICYINFO['INSURENDDATE'] = date('Y-m-d H:i:s',$t_t);
  206. //计算开始与结束日期天数
  207. $days = round(((strtotime($POLICYINFO['INSURENDDATE'])+1) - strtotime($POLICYINFO['INSURSTARTDATE']))/3600/24);
  208. $prod_arr = $sunshineConfig['prod_arr'];
  209. $prod_type = $par['prod_type']; //1乘客意外险 2旅行意外险
  210. $prod_obj = [];
  211. if($prod_type==1) $prod_obj = $prod_arr['passengerAccidentInsurance']['QP120006'];
  212. if($prod_type==2) $prod_obj = $prod_arr['travelAccidentInsurance']['QP120276'];
  213. $POLICYINFO['PRODUCTCODE'] = $prod_obj['PRODUCTCODE']; //阳光提供产品唯一代码
  214. $POLICYINFO['PLANCODE'] =$prod_obj['PLANCODE'][$days-1]; //阳光提供保险计划编码唯一代码
  215. $POLICYINFO['INSURDATE'] = date('Y-m-d H:i:s'); //客户投保时系统时间:格式yyyy-MM-dd HH:mm:ss
  216. $POLICYINFO['INSURPERIOD'] = (string)$days; //保险期间
  217. $POLICYINFO['PERIODFLAG'] = 'D'; //保险期间单位 年为Y,月为M,日为D,例:保险期间为一个月,则INSURPERIOD=’1’,PERIODFLAG = ’M’
  218. $POLICYINFO['MULT'] = '1'; //购买份数
  219. $POLICYINFO['PREMIUM'] = $prod_obj['PREMIUM'] * $days; // 保费, 如是会员价或打折购买,该字段为原始保费计算方法为单价*购买份数
  220. $AMOUNT = 0;
  221. if($cardInfo['old']<=10){
  222. $AMOUNT = $prod_obj['AMOUNT'][0];
  223. }else{
  224. $AMOUNT = $prod_obj['AMOUNT'][1];
  225. }
  226. $POLICYINFO['AMOUNT'] =$AMOUNT*$POLICYINFO['MULT']; //保额, 计算方法为单份保额*购买份数
  227. $POLICYINFO['BENEFMODE'] = '0'; //受益模式,固定值:0:法定;1:指定;指定受益人时,受益人信息不能为空
  228. $POLICYINFO['PROVINCE'] = '上海'; //投保地省 可传入具体的省市名,如北京、天津
  229. $POLICYINFO['REGION'] = '上海'; //投保地:市/县 可传入具体的中文市/县名
  230. $POLICYINFO['APPNTNAME'] = $par['policy_holder_name']; // 投保人姓名
  231. $POLICYINFO['APPNTSEX'] = $cardInfo_policy_holder['sex']=='男'?'1':'2'; // 投保人性别 1男 2女
  232. $POLICYINFO['APPNTBIRTHDAY'] =$cardInfo_policy_holder['birthday']; //投保人出生日期 日期格式 yyyy-MM-dd
  233. $POLICYINFO['APPNTIDTYPE'] = '10'; //投保人证件类型
  234. $POLICYINFO['APPNTIDNO'] = $par['policy_holder_cardid']; // 投保人证件号码
  235. $POLICYINFO['APPNTADDRESS'] = ''; //投保人通讯地址
  236. $POLICYINFO['APPNTEMAIL'] = ''; // 投保人邮箱
  237. $POLICYINFO['APPNTMOBILE'] = $par['contacts_phone']; // 投保人手机
  238. $POLICYINFO['APPNTPHONE'] = $par['contacts_phone']; //投保人通讯电话
  239. $POLICYINFO['INSUREDLIST'] = $INSUREDLIST;
  240. $ORDER = [];
  241. $ORDER['ORDERID'] = $par['order_id'];
  242. //对方说不需要传支付信息
  243. // $ORDER['PAYTYPE'] = 'ALIPAY';
  244. // $ORDER['PAYTIME'] = '2018-03-08 11:33:21'; //支付时间yyyy-MM-dd HH:mm:ss
  245. // $ORDER['PAYID'] = '88888888888';
  246. // $ORDER['MERCHANTID'] = ''; //虚拟账户号
  247. // $ORDER['PayMoney'] = '5';
  248. $ORDER['CONTACTINFO'] = $CONTACTINFO;
  249. $ORDER['POLICYINFO'] = $POLICYINFO;
  250. $params['ORDER'] = $ORDER;
  251. return $params;
  252. }
  253. }