| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- <?php
- namespace addons\UnionPay\common\service;
- use addons\UnionPay\common\enums\UnionPayEnum;
- use addons\UnionPay\common\models\UnionpayRequestLog;
- use addons\UnionPay\common\models\UnionpayUserBankCard;
- use common\models\common\PaymentTrade;
- use common\models\common\UserBankCard;
- use yii\db\Exception;
- use \Yii;
- class FastPayService extends PayService
- {
- public $yl_api_url = "https://vsp.allinpay.com/apiweb/qpay";// 快捷支付
- //快捷支付签约申请
- public function sendSignSms(UnionpayUserBankCard $unionpay_user_bankcard_model, UserBankCard $user_band_card)
- {
- $config = \Yii::$app->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;
- }
- }
|