panda 1 year ago
parent
commit
7be5187442
3 changed files with 205 additions and 0 deletions
  1. 10 0
      application/index/controller/Index.php
  2. 92 0
      application/utils/CurlUtil.php
  3. 103 0
      application/utils/PayUtil.php

+ 10 - 0
application/index/controller/Index.php

@@ -3,6 +3,7 @@
 namespace app\index\controller;
 
 use app\common\controller\Frontend;
+use app\utils\PayUtil;
 use think\Db;
 class Index extends Frontend
 {
@@ -12,6 +13,15 @@ class Index extends Frontend
     protected $layout = '';
 
 
+    /**
+     * @return void
+     */
+    public function aa()
+    {
+        $pay = new PayUtil();
+        $pay->jsPay('123123123123123','0.01','开通会员');
+        return json_encode($pay->getData());
+    }
 
     public function index()
     {

+ 92 - 0
application/utils/CurlUtil.php

@@ -0,0 +1,92 @@
+<?php
+namespace app\utils;
+
+class CurlUtil{
+    /**
+     * 模拟http get请求
+     * @param $url
+     * @param array $params
+     * @param array $header
+     * @param int $timeout
+     * @return bool|string
+     * @throws \Exception
+     */
+    public static function get($url, $params=array(), $header = array(),$timeout=30){
+        $opts = array(
+            CURLOPT_TIMEOUT => $timeout,
+            CURLOPT_RETURNTRANSFER => 1,
+            CURLOPT_SSL_VERIFYPEER => false,
+            CURLOPT_SSL_VERIFYHOST => false,
+            CURLOPT_HTTPHEADER => $header,
+            CURLOPT_URL => count($params) > 0 ? $url . '?' . http_build_query($params) : $url,
+        );
+        $ch = curl_init();
+        curl_setopt_array($ch, $opts);
+        $data = curl_exec($ch);
+        $error = curl_error($ch);
+        curl_close($ch);
+        if ($error)
+            throw new \Exception('http get error:' . $error);
+        return $data;
+    }
+
+    /**
+     * 模拟http post请求
+     * @param $url
+     * @param $params
+     * @param array $header
+     * @param int $timeout
+     * @return bool|string
+     * @throws \Exception
+     */
+    public static function post($url, $params, $header = array(), $timeout=30){
+        $opts = array(
+            CURLOPT_TIMEOUT => $timeout,
+            CURLOPT_RETURNTRANSFER => 1,
+            CURLOPT_SSL_VERIFYPEER => false,
+            CURLOPT_SSL_VERIFYHOST => false,
+            CURLOPT_HTTPHEADER => $header,
+            CURLOPT_URL => $url,
+            CURLOPT_POST => 1,
+            CURLOPT_POSTFIELDS => is_array($params) ? http_build_query($params) : $params
+        );
+        $ch = curl_init();
+        curl_setopt_array($ch, $opts);
+        $data = curl_exec($ch);
+        $error = curl_error($ch);
+        curl_close($ch);
+        if ($error)
+            throw new \Exception('http post error:' . $error);
+        return $data;
+    }
+
+    /**
+     * 模拟http post json请求
+     * @param string $url
+     * @param array $params
+     * @param array $header
+     * @param int $timeout
+     * @return bool|string
+     * @throws \Exception
+     */
+    public static function postJson(string $url, array $params, array $header = [], int $timeout=30){
+        $opts = [
+            CURLOPT_TIMEOUT => $timeout,
+            CURLOPT_RETURNTRANSFER => 1,
+            CURLOPT_SSL_VERIFYPEER => false,
+            CURLOPT_SSL_VERIFYHOST => false,
+            CURLOPT_HTTPHEADER => array_merge(["content-type:application/json"],$header),
+            CURLOPT_URL => $url,
+            CURLOPT_POST => 1,
+            CURLOPT_POSTFIELDS => json_encode($params)
+        ];
+        $ch = curl_init();
+        curl_setopt_array($ch, $opts);
+        $data = curl_exec($ch);
+        $error = curl_error($ch);
+        curl_close($ch);
+        if ($error)
+            throw new \Exception('http post error:' . $error);
+        return json_decode($data,true);
+    }
+}

+ 103 - 0
application/utils/PayUtil.php

@@ -0,0 +1,103 @@
+<?php
+
+namespace app\utils;
+
+class PayUtil
+{
+
+    private $message = '';
+    private $data = [];
+    private $config = [];
+
+    public function __construct()
+    {
+        $this->config = [
+            'huifu_id' => '6666000145960408',
+            'sys_id' => '6666000145960408',
+            'product_id' => 'YMFZS',
+            'rsaPrivateKey' => 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCWjQ+o6u8TgOQETBJs/OebvIZMLZ7J0kyAfyKXECl44R2EvfOWTNhtnDc6ZuaXegBoNo8u+skVxzy8k+unoBNghpct/BCaXc2op0F/3/3kc+Y5I74PX2lF//4MvCNP1ia+ykfHJkdnlfz2W8c2Tc1L311PPQ4dsB0c6mup/NjV1DX0WkAXWsMCHSss1iRLLb5mqVJtCkSbPmuSZV+bm+JASsD5goo32245HxqNbjKm/fi+OfZ9ONKl0wT+Ch5SQEbQAr61yhIyHdlqc7o7xupbYFKjT4ez8Y3VU4U1uKu57x2cKI0ETwsASALDqgvYS6mFjJFC3LcEjskyAAi1a+HNAgMBAAECggEABvS1iIRyT2BhKKGrKEX3HYb0XYiuEX0Z88Xr/zbL873S81MjcgpS5Z2WH6ipds44PphmvTDxIYR3Fe9vr+sBejA9w+4lhjxXSDeSGypqPKfuNy2jlmo+HvHY9xWqPAIVADOwZU8rdWnEqk1LQwMNPTgww3x6rnx4m+Fo4A3Cpv54vrK7f4fTUaaD8gHRFkSkkCvNJYEZdd5OLqCKwuAwL6vxwhX/tBuNa+zltw+9fV+FCnaBlkVncU8j8os7FBoT7MTbMoijDG78b1feUofuWUmn4A+lb/hH9R2zTNaTlGzTdyj/hybkPmz3TMPsymzIxpr239z8HZvVfnBiScFUAQKBgQDhj/mGKM7tkYuR+gRgBwlvtsPyru3DmaqabkweBz6nL9c7F5bVrLuoSZRkZTEfwU/lHDpRPqP6elLdv7NQvPt6deXZIt+LqXHcFr8k/l0xhT4EaUcYjVyj0rVfLrjM8y4yVruDEJm9d3PjYoe4vF2+TSZ3gXqwEOCflVB2Xk9eDQKBgQCq3dPb5Xj+O/8IaiGnLP/iED7hJ27EupR9MbvNS760e03dTHePKnfoeVJve06cx380RLM2mEicFUz7ee1+Kvu/79v4OabBn9WDDFMME0nb52FyRDf9jkG6jB2bKP8olVhufCvhsjxJXXCNepAZwi3m4CgWz5km3AMe77f276liwQKBgGkY9GKWURRQZH+3xqIXpUXwGozRBOfGib869Sxoo8Cygc5+x0D4ItfesM22eJUbNWbDKEkCrtTeeg3obFyKMYJ1vIrXvOEOKocp8hYCjtmsA6F6jC3cb/XFD80xr9mO1U+PKf9/lKK7LbwdBLAG1Ib+25WDNu8ibgbtQ3hjqQdhAoGBAJMHcyjDm4vZgKly+iZq2H1k0VbZob1zeBcK1rnfteiEOgp1pGPzfV70FvWLO6g5GsKVY0lVXRXCVo4G61AoGJ2e/r/ojBANQ6MS1duMNYAe6IF1JmDvKqwlqcw8SORZLtFT1EbQIoRW/WUg1CL2Lp1+wcBvPzBrHdxfFwRMUouBAoGBAKusKZFR5bqj5NDb3Uli3D0H48PxTOq5iNvkG9L/wUfUTV1p1e0bnQ+ViEmh6LdLEuvVnClDTFuyaxFe3mp0lREcPYsdk4sYXkBvTO5B7CkoVtoNLPZxfYEDRkDbCQ9LniE155qP0ikEhf4pQRB2RNuC0DfO2O5uoYXdp+uFiuNt',
+        ];
+    }
+
+    public function jsPay(string $order_no, string $amount, string $desc = '', string $notify_url = '', string $type = 'T_H5')
+    {
+        $url = "https://api.huifu.com/v2/trade/payment/jspay";
+
+        $post_data = [
+            'req_date' => date('Ymd'),
+            'req_seq_id' => $order_no,//请求流水号 示例值:rQ2021121311173944134649875651
+            'huifu_id' => $this->config['huifu_id'],//请求流水号 示例值:rQ2021121311173944134649875651
+            'goods_desc' => $desc,//商品描述
+            //交易类型T_JSAPI: 微信公众号;T_MINIAPP: 微信小程序;A_JSAPI: 支付宝JS;A_NATIVE: 支付宝正扫;U_NATIVE: 银联正扫
+            // U_JSAPI: 银联JS;D_NATIVE: 数字人民币正扫;T_H5:微信直连H5支付;T_APP:微信APP支付(只支持直连);T_NATIVE:微信正扫(只支持直连);示例值:A_NATIVE
+            'trade_type' => $type,
+            'trans_amt' => $amount,// 交易金额 单位元 最低传入0.01
+        ];
+//        ksort($post_data);
+        $data = [
+            'sys_id' => $this->config['sys_id'],
+            'product_id' => $this->config['product_id'],
+            'sign' => $this->getSign($post_data),
+            'data' => $post_data
+        ];
+
+        $res = CurlUtil::postJson($url, $data);
+        if (empty($res['data']) || $res['data']['resp_code'] != '00000000') {
+            return $this->error($res['data']['resp_desc'] ?? '下单失败', $res);
+        }
+
+        return $this->success($res['data']['resp_desc'] ?? '下单成功!', $res);
+    }
+
+    private function getSign($post_data)
+    {
+        ksort($post_data);
+        $post_data = json_encode($post_data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
+        return $this->sha_with_rsa_sign($post_data, $this->config['rsaPrivateKey']);
+    }
+
+    /**
+     * 私钥加签(对数据源排序),可用于 V2 版本接口数据加签
+     *
+     * @param string $data 原数据( 排序后的json字符串; 数组参数排序后转json字符串(数据的中文和斜杠均不转码):ksort($post_data); json_encode($post_data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); )
+     * @param string $rsaPrivateKey 私钥
+     * @param int $alg 默认 OPENSSL_ALGO_SHA256
+     * @return false|string 签名串
+     */
+    private function sha_with_rsa_sign(string $data, string $rsaPrivateKey, int $alg = OPENSSL_ALGO_SHA256)
+    {
+        $key = "-----BEGIN PRIVATE KEY-----\n" . wordwrap($rsaPrivateKey, 64, "\n", true) . "\n-----END PRIVATE KEY-----";
+        $signature = '';
+        try {
+            openssl_sign($data, $signature, $key, $alg);
+            return base64_encode($signature);
+        } catch (\Exception $e) {
+            $this->message = $e->getMessage();
+            return false;
+        }
+    }
+
+    private function success($message = '', $data = [])
+    {
+        $this->message = $message;
+        $this->data = $data;
+        return true;
+    }
+
+    private function error($message = '', $data = [])
+    {
+        $this->message = $message;
+        $this->data = $data;
+        return false;
+    }
+
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+    public function getData()
+    {
+        return $this->data;
+    }
+}