| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- <?php
- namespace common\pay\huayin;
- use backend\models\Deposit;
- use common\helpers\Utils;
- use common\pay\BasePayHandler;
- use Yii;
- class PayHandler extends BasePayHandler
- {
- public $payUrl;
- public $merchantCode;
- public $publicKey;
- public $privateKey;
- /**
- * @inheritdoc
- */
- public function init()
- {
- parent::init();
- if ($this->payUrl == null) {
- $this->payUrl = Yii::$app->params['huayin.payUrl'];
- }
- if ($this->merchantCode == null) {
- $this->merchantCode = Yii::$app->params['huayin.merchantCode'];
- }
- if ($this->publicKey == null) {
- $this->publicKey = Yii::$app->params['huayin.publicKey'];
- }
- if ($this->privateKey == null) {
- $this->privateKey = Yii::$app->params['huayin.privateKey'];
- }
- }
- /**
- * @param array $deposit
- * @param array $params
- * @return string
- */
- public function outPay($deposit, $params = [])
- {
- $data = [];
- $data['merchant_code'] = $this->merchantCode; // 参数名称:商家号 商户签约时,华银分配给商家的唯一身份标识
- $data['service_type'] = 'direct_pay'; // 参数名称:服务类型 固定值:direct_pay
- $data['notify_url'] = $this->notifyUrl; // 参数名称:服务器异步通知地址 支付成功后,华银会主动发送通知给商户,商户必须指定此通知地址
- $data['interface_version'] = 'V3.0'; // 参数名称:接口版本
- $data['input_charset'] = 'UTF-8'; // 参数名称:参数编码字符集 取值:UTF-8、GBK(必须大写)
- $data['sign_type'] = 'RSA-S'; // 参数名称:签名方式
- // 1.取值为:RSA或RSA-S,RSA使用pfx证书文件进行数据加密,RSA-S使用字符串密钥进行数据加密,商户需要从中选择一个值
- // 2.该字段不参与签名
- // $data['sign'] = ''; // 参数名称:签名数据 该字段不参与签名,值如何获取,请参考华银提供的示例代码。
- $data['return_url'] = $this->returnUrl; // 参数名称:页面跳转同步通知地址 支付成功后,通过页面跳转的方式跳转到商家网站
- $data['pay_type'] = 'b2c'; // 参数名称:支付类型 取值如下(必须小写,多选时请用逗号隔开)b2c(网银支付),weixin(微信扫码),alipay_scan(支付宝扫码),tenpay_scan(qq钱包扫码)
- $data['client_ip'] = isset($params['ip']) ? $params['ip'] : Utils::getClientIp(); // 参数名称:客户端IP 消费者创建交易时所使用机器的IP,最大长度为15个字符。举例:183.62.225.12
- $data['client_ip_check'] = '0'; // 参数名称:客户端IP是否校验标识 当值为1校验客户端IP;当值为0不校验客户端IP;
- $data['order_no'] = $deposit['id']; // 参数名称:商家订单号 商家网站生成的订单号,由商户保证其唯一性,由字母、数字、下划线组成。
- $data['order_time'] = date('Y-m-d H:i:s'); // 参数名称:商家订单时间 时间格式:yyyy-MM-dd HH:mm:ss
- $data['order_amount'] = number_format($deposit['rmb'], 2, '.', ''); // 参数名称:商家订单金额 以元为单位,精确到小数点后两位.例如:12.01
- $data['bank_code'] = $params['bankCode']; // 参数名称:网银直连银行代码 参见附录中的银行代码对照表,当该参数为空或与对照表中银行编码不一致时,直接跳转到华银收银台选择银行页面
- // $data['redo_flag'] = ''; // 参数名称:是否允许重复订单 当值为1时不允许商户订单号重复提交;当值为 0或空时允许商户订单号重复提交
- $data['product_name'] = 'RJ' . $deposit['id']; // 参数名称:商品名称
- // $data['product_code'] = ''; // 参数名称:商品编号
- // $data['product_num'] = ''; // 参数名称:商品数量 必须是整型数字
- // $data['product_desc'] = ''; // 参数名称:商品描述
- // $data['extra_return_param'] = ''; // 参数名称:回传参数 商户如果支付请求是传递了该参数,则通知商户支付成功时会回传该参数
- // $data['extend_param'] = ''; // 参数名称:业务扩展参数 格式:参数名1^参数值1|参数名2^参数值2...,多个参数使用“|”进行分割 例如:name ^Zhang San|sex^Male 跨境商家必选,非跨境商家可选
- // $data['show_url'] = ''; // 参数名称:商品展示URL 不得超过200个字符
- // $data['orders_info'] = ''; // 储存子订单的相关信息,限制20个商品
- $data['sign'] = PayUtils::makeSign($data, $this->privateKey);
- return static::createHtml($data, $this->payUrl);
- }
- /**
- * @param array $data
- * @return bool
- */
- public function handleNotify($data)
- {
- if (PayUtils::checkSign($data, $this->publicKey)) {
- if (isset($data['trade_status']) && $data['trade_status'] == 'SUCCESS') {
- $merOrderId = trim($data['order_no']);
- // $merOrderId = str_ireplace("SN", "", $merOrderId);
- /** @var Deposit $model */
- $model = Deposit::find()->where(['id' => $merOrderId])->asArray()->limit(1)->one();
- if ($model) {
- // $model->type = 1;
- // $model->save(false);
- return true;
- }
- }
- }
- return false;
- }
- public function outNotify($success)
- {
- if ($success == true) {
- return "SUCCESS";
- } else {
- return "ERROR";
- }
- }
- /**
- * @param array $data
- * @return bool
- */
- public function handleReturn($data)
- {
- if (PayUtils::checkSign($data, $this->publicKey)) {
- if (isset($data['trade_status']) && $data['trade_status'] == 'SUCCESS') {
- $merOrderId = trim($data['order_no']);
- // $merOrderId = str_ireplace("SN", "", $merOrderId);
- /** @var Deposit $model */
- $model = Deposit::find()->where(['id' => $merOrderId])->asArray()->limit(1)->one();
- if ($model) {
- return true;
- }
- }
- }
- return false;
- }
- public function outReturn($success)
- {
- }
- }
|