services->setting->addons->get($unionpay_user_bankcard_model->mall_id, UnionPayEnum::ADDONS_NAME, 'basic'); $card_type = strtolower($user_band_card->card_type); $accttype = ''; switch ($card_type) { case 'dc': $accttype = '00'; break; case 'cc': $accttype = '02'; } $params = []; $params["cusid"] = $config['cusid']; $params["appid"] = $config['appid']; $params["orgid"] = $config['orgid']; $params["version"] = $this->version; $params["randomstr"] = md5(microtime(true)); $params["signtype"] = $this->sign_type; $params["meruserid"] = $user_band_card->user_id; $params["accttype"] = $accttype; $params["acctno"] = $user_band_card->bank_card_no; $params["idtype"] = $unionpay_user_bankcard_model->id_type; $params["idno"] = $unionpay_user_bankcard_model->id_no; $params["acctname"] = $user_band_card->payer_name; $params["mobile"] = $unionpay_user_bankcard_model->mobile; $params["validdate"] = $unionpay_user_bankcard_model->validdate; $params["cvv2"] = $unionpay_user_bankcard_model->cvv2; $params["sign"] = urlencode($this->sign($params, $config['private_key']));//签名 $params_str = $this->ToUrlParams($params); $url = $this->yl_api_url . "/agreeapply"; $rsp = $this->request($url, $params_str); $add_data = [ 'type' => 'agreeapply', 'out_trade_no' => '', 'oldtrxid' => '', 'trade_type' => '', 'randomstr' => $params["randomstr"], 'request_data' => $params_str, 'response_data' => $rsp ]; UnionpayRequestLog::setData($unionpay_user_bankcard_model->mall_id, $add_data); $rsp = json_decode($rsp, true); if ($rsp['retcode'] != 'SUCCESS') { $msg = $rsp['retmsg'] ?? '系统内部错误'; throw new Exception($msg); } if (!$this->validSign($rsp, $config['union_pay_public_key'])) { throw new Exception('验签失败'); } if ($rsp['trxstatus'] != '1999') { throw new Exception($rsp['errmsg']); } $rsp['card_id'] = $user_band_card->id; return [ 'data' => ['agreeid' => $unionpay_user_bankcard_model->sign_no, 'back_image' => UserBankCard::getBankPicture($user_band_card->bank_code), 'bank_account_type' => $user_band_card->bank_account_type, 'bank_card_no' => $user_band_card->bank_card_no, 'bank_code' => $user_band_card->bank_code, 'bank_name' => $user_band_card->bank_name, 'card_type' => $user_band_card->card_type, 'card_type_name' => $user_band_card->card_type_name, 'created_at' => $user_band_card->created_at, 'icon' => UserBankCard::getBankPicture($user_band_card->bank_code), 'id' => $user_band_card->id, 'is_sign' => $unionpay_user_bankcard_model->is_sign, 'mall_id' => $user_band_card->mall_id, 'payer_name' => $user_band_card->payer_name, 'status' => $user_band_card->status, 'updated_at' => $user_band_card->updated_at, 'user_id' => $user_band_card->user_id, ], 'card_id' => $user_band_card->id, 'id_no' => $unionpay_user_bankcard_model->id_no, 'mobile' => $unionpay_user_bankcard_model->mobile, 'cvv2' => $unionpay_user_bankcard_model->cvv2, 'validdate' => $unionpay_user_bankcard_model->validdate, 'thpinfo' => $rsp['thpinfo'], 'trxstatus' => $rsp['trxstatus'] ]; } //签约申请确认 public function agreeConfirm($mall_id, $user_id, $card_id, $smscode, $thpinfo) { $user_band_card = UserBankCard::findOne(['id' => $card_id]); $unionpay_user_bankcard_model = UnionpayUserBankCard::findOne(['card_id' => $card_id]); $config = \Yii::$app->services->setting->addons->get($mall_id, UnionPayEnum::ADDONS_NAME, 'basic'); $card_type = strtolower($user_band_card->card_type); $accttype = ''; switch ($card_type) { case 'dc': $accttype = '00'; break; case 'cc': $accttype = '02'; } $params = []; $params["cusid"] = $config['cusid']; $params["appid"] = $config['appid']; $params["orgid"] = $config['orgid']; $params["version"] = $this->version; $params["reqtime"] = date('YmdHis', time()); $params["meruserid"] = $user_id; $params["accttype"] = $accttype; $params["acctno"] = $user_band_card->bank_card_no; $params["idtype"] = $unionpay_user_bankcard_model->id_type; $params["idno"] = $unionpay_user_bankcard_model->id_no; $params["acctname"] = $user_band_card->payer_name; $params["mobile"] = $unionpay_user_bankcard_model->mobile; $params["validdate"] = $unionpay_user_bankcard_model->validdate; $params["cvv2"] = $unionpay_user_bankcard_model->cvv2; $params["smscode"] = $smscode; $params["thpinfo"] = $thpinfo; $params["randomstr"] = md5(microtime(true)); $params["signtype"] = $this->sign_type; $params["sign"] = urlencode($this->sign($params, $config['private_key']));//签名 $params_str = $this->toUrlParams($params); $url = $this->yl_api_url . "/agreeconfirm"; $rsp = $this->request($url, $params_str); $add_data = [ 'type' => 'agreeconfirm', 'out_trade_no' => '', 'oldtrxid' => '', 'trade_type' => '', 'randomstr' => $params["randomstr"], 'request_data' => $params_str, 'response_data' => $rsp ]; UnionpayRequestLog::setData($unionpay_user_bankcard_model->mall_id, $add_data); $rsp = json_decode($rsp, true); if ($rsp['retcode'] != 'SUCCESS') { $msg = $rsp['retmsg'] ?? '系统内部错误'; throw new Exception($msg); } if (!$this->validSign($rsp, $config['union_pay_public_key'])) { throw new Exception('验签失败'); } if (empty($rsp['agreeid']) || $rsp['trxstatus'] != '0000') { throw new Exception($rsp['errmsg']); } $unionpay_user_bankcard_model->sign_no = $rsp['agreeid']; $unionpay_user_bankcard_model->is_sign = 1; $unionpay_user_bankcard_model->save(); $user_band_card->bank_code = $rsp['bankcode']; $user_band_card->bank_name = $rsp['bankname']; $user_band_card->save(); return [ 'data' => ['agreeid' => $unionpay_user_bankcard_model->sign_no, 'back_image' => UserBankCard::getBankPicture($user_band_card->bank_code), 'bank_account_type' => $user_band_card->bank_account_type, 'bank_card_no' => $user_band_card->bank_card_no, 'bank_code' => $user_band_card->bank_code, 'bank_name' => $user_band_card->bank_name, 'card_type' => $user_band_card->card_type, 'card_type_name' => $user_band_card->card_type_name, 'created_at' => $user_band_card->created_at, 'icon' => UserBankCard::getBankPicture($user_band_card->bank_code), 'id' => $user_band_card->id, 'is_sign' => $unionpay_user_bankcard_model->is_sign, 'mall_id' => $user_band_card->mall_id, 'payer_name' => $user_band_card->payer_name, 'status' => $user_band_card->status, 'updated_at' => $user_band_card->updated_at, 'user_id' => $user_band_card->user_id, ], 'card_id' => $user_band_card->id, 'trxstatus' => $rsp['trxstatus'], 'errmsg' => $rsp['errmsg'] ]; } //商户支付申请 public function payapplyagree($user_id, $card_id, $trade_no) { $trade = PaymentTrade::findOne(['mall_id' => $this->mall_id, 'user_id' => $user_id, 'out_trade_no' => $trade_no]); $config = \Yii::$app->services->setting->addons->get($trade->mall_id, UnionPayEnum::ADDONS_NAME, 'basic'); $unionpay_user_bankcard_model = UnionpayUserBankCard::findOne(['user_id' => $trade->user_id, 'card_id' => $card_id]); if (empty($unionpay_user_bankcard_model)) throw new Exception('用户银行卡未签约'); $params = []; $params["cusid"] = $config['cusid']; $params["appid"] = $config['appid']; $params["orgid"] = $config['orgid']; $params["version"] = $this->version; $params["randomstr"] = md5(microtime(true)); $params["signtype"] = $this->sign_type; $params["reqtime"] = date('YmdHis', time()); $params["agreeid"] = $unionpay_user_bankcard_model->sign_no; $params["amount"] = $trade->pay_fee * 100; $params["reqsn"] = $trade->out_trade_no; $params["currency"] = 'CNY'; $params["subject"] = $trade->title; $params["notifyurl"] = \Yii::$app->services->setting->platform->get('system.api_url') . "/union-pay/notify/notify"; $params["sign"] = urlencode($this->sign($params, $config['private_key']));//签名 $params_str = $this->ToUrlParams($params); $url = $this->yl_api_url . "/payapplyagree"; $rsp = $this->request($url, $params_str); $add_data = [ 'type' => 'payapplyagree', 'out_trade_no' => $trade->out_trade_no, 'oldtrxid' => '', 'trade_type' => $trade->trade_type, 'randomstr' => $params["randomstr"], 'request_data' => $params_str, 'response_data' => $rsp ]; UnionpayRequestLog::setData($unionpay_user_bankcard_model->mall_id, $add_data); $rsp = json_decode($rsp, true); if ($rsp['retcode'] != 'SUCCESS') { $msg = $rsp['retmsg'] ?? '系统内部错误'; throw new Exception($msg); } if (!$this->validSign($rsp, $config['union_pay_public_key'])) { throw new Exception('验签失败'); } if ($rsp['trxstatus'] == '0000' || $rsp['trxstatus'] == '1999') { Yii::error('payapplyagree::response' . json_encode($rsp)); $trade->trade_type = 'fast_pay'; $trade->save(); } else { throw new Exception($rsp['errmsg']); } return ['errmsg' => $rsp['errmsg'], 'reqsn' => $rsp['reqsn'], 'thpinfo' => $rsp['thpinfo'], 'trxstatus' => $rsp['trxstatus']]; } //支付确认 public function payagreeconfirm($mall_id, $user_id, $trade_no, $card_id, $thpinfo, $smscode) { $trade = PaymentTrade::findOne(['user_id' => $user_id, 'out_trade_no' => $trade_no]); $unionpay_user_bankcard_model = UnionpayUserBankCard::findOne(['user_id' => $user_id, 'card_id' => $card_id]); $config = \Yii::$app->services->setting->addons->get($mall_id, UnionPayEnum::ADDONS_NAME, 'basic'); $params = []; $params["cusid"] = $config['cusid']; $params["appid"] = $config['appid']; $params["orgid"] = $config['orgid']; $params["version"] = $this->version; $params["randomstr"] = md5(microtime(true)); $params["signtype"] = $this->sign_type; $params["reqtime"] = date('YmdHis', time()); $params["amount"] = $trade->pay_fee * 100; $params["currency"] = 'CNY'; $params["reqsn"] = $trade->out_trade_no; $params["agreeid"] = $unionpay_user_bankcard_model->sign_no; $params["smscode"] = $smscode; $params["thpinfo"] = $thpinfo; $params["sign"] = urlencode($this->sign($params, $config['private_key']));//签名 $params_str = $this->toUrlParams($params); $url = $this->yl_api_url . "/payagreeconfirm"; $rsp = $this->request($url, $params_str); $rsp = json_decode($rsp, true); $add_data = [ 'type' => 'payagreeconfirm', 'out_trade_no' => $trade->out_trade_no, 'oldtrxid' => $rsp['trxid'] ?? '', 'trade_type' => $trade->trade_type, 'randomstr' => $params["randomstr"], 'request_data' => $params_str, 'response_data' => json_encode($rsp) ]; UnionpayRequestLog::setData($unionpay_user_bankcard_model->mall_id, $add_data); if ($rsp['retcode'] != 'SUCCESS') { $msg = $rsp['retmsg'] ?? '系统内部错误'; throw new Exception($msg); } if (!$this->validSign($rsp, $config['union_pay_public_key'])) { throw new Exception('验签失败'); } if ($rsp['trxstatus'] == '0000') { $trade->third_trade_no = $rsp['trxid']; $trade->save(); } else { throw new Exception($rsp['errmsg']); } return ['fintime' => $rsp['fintime'], 'amount' => $trade->pay_fee, 'reqsn' => $rsp['reqsn'], 'trxid' => $rsp['trxid'], 'trxstatus' => $rsp['trxstatus']]; } //重新获取支付短信 public function paysmsagree($mall_id, $user_id, $card_id, $trade_no, $thpinfo) { $config = \Yii::$app->services->setting->addons->get($mall_id, UnionPayEnum::ADDONS_NAME, 'basic'); $unionpay_user_bankcard_model = UnionpayUserBankCard::findOne(['card_id' => $card_id]); $params = []; $params["cusid"] = $config['cusid']; $params["appid"] = $config['appid']; $params["orgid"] = $config['orgid']; $params["version"] = $this->version; $params["reqtime"] = date('YmdHis', time()); $params["randomstr"] = md5(microtime(true)); $params["signtype"] = $this->sign_type; $params["meruserid"] = $user_id; $params["orderid"] = $trade_no; $params["agreeid"] = $unionpay_user_bankcard_model->sign_no; $params["thpinfo"] = $thpinfo; $params["sign"] = urlencode($this->sign($params, $config['private_key']));//签名 $params_str = $this->toUrlParams($params); $url = $this->yl_api_url . "/paysmsagree"; $rsp = $this->request($url, $params_str); $rsp = json_decode($rsp, true); $add_data = [ 'type' => 'paysmsagree', 'out_trade_no' => $trade_no, 'oldtrxid' => $rsp['trxid'] ?? '', 'trade_type' => 'fat_pay', 'randomstr' => $params["randomstr"], 'request_data' => $params_str, 'response_data' => json_encode($rsp) ]; UnionpayRequestLog::setData($unionpay_user_bankcard_model->mall_id, $add_data); if ($rsp['retcode'] != 'SUCCESS') { $msg = $rsp['retmsg'] ?? '系统内部错误'; throw new Exception($msg); } if (!$this->validSign($rsp, $config['union_pay_public_key'])) { throw new Exception('验签失败'); } if (!empty($rsp['errmsg'])) { throw new Exception($rsp['errmsg']); } return $rsp; } //银行卡解绑接口 public function unbind($user_id, $card_id) { $config = $this->config; $unionpay_user_bankcard_model = UnionpayUserBankCard::findOne(['mall_id' => $this->mall_id, 'user_id' => $user_id, 'card_id' => $card_id]); $params = []; $params["cusid"] = $config['cusid']; $params["appid"] = $config['appid']; $params["orgid"] = $config['orgid']; $params["version"] = $this->version; $params["randomstr"] = md5(microtime(true)); $params["signtype"] = $this->sign_type; $params["agreeid"] = $unionpay_user_bankcard_model->sign_no; $params["sign"] = urlencode($this->sign($params, $config['private_key']));//签名 $params_str = $this->toUrlParams($params); $url = $this->yl_api_url . "/unbind"; $rsp = $this->request($url, $params_str); $add_data = [ 'type' => 'unbind', 'out_trade_no' => '', 'oldtrxid' => '', 'trade_type' => 'fat_pay', 'randomstr' => $params["randomstr"], 'request_data' => $params_str, 'response_data' => $rsp ]; UnionpayRequestLog::setData($unionpay_user_bankcard_model->mall_id, $add_data); $rsp = json_decode($rsp, true); if ($rsp['retcode'] != 'SUCCESS') { $msg = $rsp['retmsg'] ?? '系统内部错误'; throw new Exception($msg); } if (!$this->validSign($rsp, $config['union_pay_public_key'])) { throw new Exception('验签失败'); } $unionpay_user_bankcard_model->is_sign = 0; $unionpay_user_bankcard_model->sign_no = ''; $unionpay_user_bankcard_model->save(); return $rsp; } }