payUrl == null) { $this->payUrl = Yii::$app->params['dinpay.payUrl']; } if ($this->merId == null) { $this->merId = Yii::$app->params['dinpay.merId']; } if ($this->merchantPrivateKey == null) { $this->merchantPrivateKey = Yii::$app->params['dinpay.merchantPrivateKey']; } if ($this->publicKey == null) { $this->publicKey = Yii::$app->params['dinpay.publicKey']; } } /** * @param array $deposit * @param array $params * @return string */ public function outPay($deposit, $params = []) { $data = []; $data['merchant_code'] = $this->merId; $data['service_type'] = "direct_pay"; $data['interface_version'] = "V3.0"; $data['sign_type'] = "RSA-S"; $data['input_charset'] = "UTF-8"; $data['notify_url'] = $this->notifyUrl; $data['order_no'] = $deposit['order_sn']; $data['order_time'] = date( 'Y-m-d H:i:s' ); $data['order_amount'] = $deposit['rmb']; // 金额 $data['product_name'] = $deposit['order_sn']; //以下参数为可选参数,如有需要,可参考文档设定参数值 $data['return_url'] = $this->returnUrl;; $data['pay_type'] = ""; $data['redo_flag'] = ""; $data['product_code'] = ""; $data['product_desc'] = ""; $data['product_num'] = ""; $data['show_url'] = ""; $data['client_ip'] = "" ; $data['bank_code'] = ""; $data['extend_param'] = ""; $data['extra_return_param'] = ""; $signStr= ""; if($data['bank_code'] != ""){ $signStr = $signStr."bank_code=".$data['bank_code']."&"; } if($data['client_ip'] != ""){ $signStr = $signStr."client_ip=".$data['client_ip']."&"; } if($data['extend_param'] != ""){ $signStr = $signStr."extend_param=".$data['extend_param']."&"; } if($data['extra_return_param'] != ""){ $signStr = $signStr."extra_return_param=".$data['extra_return_param']."&"; } $signStr = $signStr."input_charset=".$data['input_charset']."&"; $signStr = $signStr."interface_version=".$data['interface_version']."&"; $signStr = $signStr."merchant_code=".$data['merchant_code']."&"; $signStr = $signStr."notify_url=".$data['notify_url']."&"; $signStr = $signStr."order_amount=".$data['order_amount']."&"; $signStr = $signStr."order_no=".$data['order_no']."&"; $signStr = $signStr."order_time=".$data['order_time']."&"; if($data['pay_type'] != ""){ $signStr = $signStr."pay_type=".$data['pay_type']."&"; } if($data['product_code'] != ""){ $signStr = $signStr."product_code=".$data['product_code']."&"; } if($data['product_desc'] != ""){ $signStr = $signStr."product_desc=".$data['product_desc']."&"; } $signStr = $signStr."product_name=".$data['product_name']."&"; if($data['product_num'] != ""){ $signStr = $signStr."product_num=".$data['product_num']."&"; } if($data['redo_flag'] != ""){ $signStr = $signStr."redo_flag=".$data['redo_flag']."&"; } if($data['return_url'] != ""){ $signStr = $signStr."return_url=".$data['return_url']."&"; } $signStr = $signStr."service_type=".$data['service_type']; if($data['show_url'] != ""){ $signStr = $signStr."&show_url=".$data['show_url']; } ///////////////////////////// 获取sign值(RSA-S加密) ///////////////////////////////// $merchant_private_key= openssl_get_privatekey($this->merchantPrivateKey); openssl_sign($signStr,$sign_info,$merchant_private_key,OPENSSL_ALGO_MD5); $data['sign'] = base64_encode($sign_info); Yii::warning('支付请求参数,' . VarDumper::dumpAsString($data), __METHOD__); // $result = PayUtils::createHtml($this->payUrl, $data); $html = <<
eot; Yii::warning('支付请求结果,' . VarDumper::dumpAsString($html), __METHOD__); return $html; } /** * @param array $data * @return bool */ public function handleNotify($data) { Yii::warning('支付异步通知参数,' . VarDumper::dumpAsString($data), __METHOD__); $merchant_code = $data["merchant_code"]; $interface_version = $data["interface_version"]; $sign_type = $data["sign_type"]; $dinpaySign = base64_decode($data["sign"]); $notify_type = $data["notify_type"]; $notify_id = $data["notify_id"]; $order_no = $data["order_no"]; $order_time = $data["order_time"]; $order_amount = $data["order_amount"]; $trade_status = $data["trade_status"]; $trade_time = $data["trade_time"]; $trade_no = $data["trade_no"]; $bank_seq_no = $data["bank_seq_no"]; $extra_return_param = $data["extra_return_param"]; ///////////////////////////// 参数组装 ///////////////////////////////// /** 除了sign_type dinpaySign参数,其他非空参数都要参与组装,组装顺序是按照a~z的顺序,下划线"_"优先于字母 */ $signStr = ""; if($bank_seq_no != ""){ $signStr = $signStr."bank_seq_no=".$bank_seq_no."&"; } if($extra_return_param != ""){ $signStr = $signStr."extra_return_param=".$extra_return_param."&"; } $signStr = $signStr."interface_version=".$interface_version."&"; $signStr = $signStr."merchant_code=".$merchant_code."&"; $signStr = $signStr."notify_id=".$notify_id."&"; $signStr = $signStr."notify_type=".$notify_type."&"; $signStr = $signStr."order_amount=".$order_amount."&"; $signStr = $signStr."order_no=".$order_no."&"; $signStr = $signStr."order_time=".$order_time."&"; $signStr = $signStr."trade_no=".$trade_no."&"; $signStr = $signStr."trade_status=".$trade_status."&"; $signStr = $signStr."trade_time=".$trade_time; //echo $signStr; ///////////////////////////// RSA-S验证 ///////////////////////////////// Yii::warning('支付异步通知加密串dinpay_string,' . VarDumper::dumpAsString($signStr), __METHOD__); $dinpay_public_key = openssl_get_publickey($this->publicKey); Yii::warning('支付异步通知加密串dinpay_puliic,' . VarDumper::dumpAsString($dinpay_public_key), __METHOD__); $flag = openssl_verify($signStr,$dinpaySign,$dinpay_public_key,OPENSSL_ALGO_MD5); Yii::warning('支付异步通知加密串dinpay,' . $flag, __METHOD__); if ($flag) { if ($trade_status == 'SUCCESS') { $merOrderId = $order_no; $reuslt = Deposit::find()->where(['order_sn' => $merOrderId])->asArray()->limit(1)->one(); if ($reuslt['type'] != 1 ) { $res = Deposit::updateAll(['type' => 1], "order_sn = $merOrderId"); $configData = Config::find()->asArray()->one(); if ($configData['auto_deposit'] == 1 && $res) { $syncDespositModel = new SyncDesposit(); $syncDespositModel->login = $reuslt['login']; $syncDespositModel->amount = $reuslt['amount']; $syncDespositModel->comment = 'Deposit'; $syncDespositModel->memo = $merOrderId; $syncDespositModel->type = 2; $syncDespositModel->in_time = time(); $syncDespositModel->save(); } return true; } } } Yii::warning('支付异步通知加密失败,' . VarDumper::dumpAsString($signStr), __METHOD__); return false; } public function outNotify($success) { if ($success == true) { return "SUCCESS"; } else { return "Verification Error"; } } /** * @param array $data * @return bool */ public function handleReturn($data) { return $this->handleNotify($data); } public function outReturn($success) { } }