ThinkPHP6 도킹으로 WeChat H5 결제 실현

王雪芹
풀어 주다: 2020-09-09 17:41:20
원래의
3801명이 탐색했습니다.

WeChat H5 결제는 모바일 전자상거래 웹페이지에 없어서는 안 될 기능입니다. 오늘은 WeChat H5 결제 구현을 위해 ThinkPHP6 도킹 구현을 안내해 드리겠습니다.

1. 준비

WeChat 결제를 하려면 기업 자격과 인증된 WeChat 서비스 계정도 필요합니다. 물론 WeChat에 300위안을 지불해야 합니다.

구체적으로 자격을 신청한 후 WeChat 결제 플랫폼을 열고 탐색에서 "제품 센터"를 클릭합니다. - "'H5 결제'를 클릭하고 열리는 페이지에서 관련 도메인 이름 정보를 입력 및 구성합니다. 그런 다음 공식 WeChat 검토가 통과될 때까지 기다리시면 됩니다. 신청서가 승인되지 않으면 H5 결제가 성공적으로 활성화될 때까지 WeChat에서 이유를 알려드립니다.

2. WeChat H5 결제와 연결

먼저 WeChat H5 결제의 공식 문서를 엽니다. 안타깝게도 WeChat H5 결제는 공식 SDK 및 DEMO 없이는 공식 SDK 및 DEMO를 준비하지 않습니다. DEMO, 우리가 직접 해야 합니다.

WeChat H5 결제는 어렵지 않습니다. 통합 주문 장을 모두 읽었습니다.

1. 매개변수를 준비합니다.

WeChat 공식에서 매개변수를 자세히 나열했습니다. 이 매개변수를 얻는 것은 어렵지 않습니다. 하나는 서명 기호이고 다른 하나는 터미널 IPspbill_create_ip입니다.

서명 담당자가 자세한 지침을 주었습니다. ASCII 코드는 key1=value1&key2=value2 형식으로 작은 것부터 큰 것까지 정렬됩니다. 정렬 후 StringA를 얻고, 얻은 StringA와 키를 이용해 이들을 이어붙인 후 최종적으로 대문자로 변환한다.

자세한 코드를 살펴보겠습니다.

public function index(){

        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址

        //1.获取调用统一下单接口所需必备参数
        $appid = 'wxff5b6b241a4fb11';//微信公众号appid
        $mch_id = '152223331';//微信支付商户号
        $key = 'b304911d6a9f7728d264dfd695ebae1';//自己设置的微信商家key
        $out_trade_no = time();//平台内部订单号
        $nonce_str=MD5(time());//随机字符串
        $body = '商品购买';//付款内容
        $total_fee = 1;//订单总金额,单位为分
        $spbill_create_ip = $this -> get_client_ip(); //获得用户设备IP
        $attach = 'weixinh5';//附加数据(自定义,在支付通知中原样返回)        
        $notify_url = "http://www.xxx.cn/mobile/WechatPay/notify";//通知地址
        $trade_type = 'MWEB';//交易类型,微信H5支付时固定为MWEB

        //2.将参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串
        $signA ="appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type";
        
        //3.拼接字符串
        $strSignTmp = $signA."&key=$key";

        //4.MD5加密后转换成大写
        $sign = strtoupper(MD5($strSignTmp));

        //5.拼接成所需XML格式
        $post_data = "<xml> 
                <appid>$appid</appid> 
                <attach>$attach</attach> 
                <body>$body</body> 
                <mch_id>$mch_id</mch_id> 
                <nonce_str>$nonce_str</nonce_str> 
                <notify_url>$notify_url</notify_url> 
                <out_trade_no>$out_trade_no</out_trade_no> 
                <spbill_create_ip>$spbill_create_ip</spbill_create_ip> 
                <total_fee>$total_fee</total_fee> 
                <trade_type>$trade_type</trade_type>
                <sign>$sign</sign> 
                </xml>";

    }
로그인 후 복사

A $this는 여기서 사용됩니다. -> get_client_ip() 이 메서드의 코드를 살펴보겠습니다.

public function get_client_ip() {
        if(getenv(&#39;HTTP_CLIENT_IP&#39;) && strcasecmp(getenv(&#39;HTTP_CLIENT_IP&#39;), &#39;unknown&#39;)) {
            $ip = getenv(&#39;HTTP_CLIENT_IP&#39;);
        } elseif(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;) && strcasecmp(getenv(&#39;HTTP_X_FORWARDED_FOR&#39;), &#39;unknown&#39;)) {
            $ip = getenv(&#39;HTTP_X_FORWARDED_FOR&#39;);
        } elseif(getenv(&#39;REMOTE_ADDR&#39;) && strcasecmp(getenv(&#39;REMOTE_ADDR&#39;), &#39;unknown&#39;)) {
            $ip = getenv(&#39;REMOTE_ADDR&#39;);
        } elseif(isset($_SERVER[&#39;REMOTE_ADDR&#39;]) && $_SERVER[&#39;REMOTE_ADDR&#39;] && strcasecmp($_SERVER[&#39;REMOTE_ADDR&#39;], &#39;unknown&#39;)) {
            $ip = $_SERVER[&#39;REMOTE_ADDR&#39;];
        }
        return preg_match ( &#39;/[\d\.]{7,15}/&#39;, $ip, $matches ) ? $matches [0] : &#39;&#39;;
    }
로그인 후 복사

2. Post 매개변수를 공식 주소로 변경합니다.

공식 주소는 URL 주소입니다: https://api.mch.weixin.qq.com/pay/unifiedorder. 이 주소는 변경할 수 없습니다. 준비된 xml 매개변수를 게시합니다.

$dataxml = $this -> httpRequest($url,'POST',$post_data);

여기서 httpRequest 메소드는 게시물 데이터를 보내는 데 사용됩니다.

public function httpRequest($url, $method, $postfields = null, $headers = array(), $debug = false) {
        $method = strtoupper($method);
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在发起连接前等待的时间,如果设置为0,则无限等待 */
        curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 设置cURL允许执行的最长秒数 */
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
        switch ($method) {
        case "POST":
            curl_setopt($ci, CURLOPT_POST, true);
            if (!empty($postfields)) {
            $tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
            curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
            }
            break;
        default:
            curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //设置请求方式 */
            break;
        }
        $ssl = preg_match(&#39;/^https:\/\//i&#39;,$url) ? TRUE : FALSE;
        curl_setopt($ci, CURLOPT_URL, $url);
        if($ssl){
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
        }
        curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ci, CURLOPT_MAXREDIRS, 2);/*指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的*/
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ci, CURLINFO_HEADER_OUT, true);
        $response = curl_exec($ci);
        $requestinfo = curl_getinfo($ci);
        if ($debug) {
            echo "=====post data======\r\n";
            var_dump($postfields);
            echo "=====info===== \r\n";
            print_r($requestinfo);
            echo "=====response=====\r\n";
            print_r($response);
        }
        curl_close($ci);
        return $response;
    }
로그인 후 복사

전체 코드를 살펴보세요:

public function index(){

        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址

        //1.获取调用统一下单接口所需必备参数
        $appid = &#39;wxff5b68b241a4fb11&#39;;//微信公众号appid
        $mch_id = &#39;1522223331&#39;;//微信支付商户号
        $key = &#39;b304911d6a19f7728d264dfd695ebae1&#39;;//自己设置的微信商家key
        $out_trade_no = time();//平台内部订单号
        $nonce_str=MD5(time());//随机字符串
        $body = &#39;商品购买&#39;;//付款内容
        $total_fee = 1;//订单总金额,单位为分
        $spbill_create_ip = $this -> get_client_ip(); //获得用户设备IP
        $attach = &#39;weixinh5&#39;;//附加数据(自定义,在支付通知中原样返回)        
        $notify_url = "http://www.dongpaiweb.cn/mobile/WechatPay/notify";//通知地址
        $trade_type = &#39;MWEB&#39;;//交易类型,微信H5支付时固定为MWEB

        //2.将参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串
        $signA ="appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type";
        
        //3.拼接字符串
        $strSignTmp = $signA."&key=$key";

        //4.MD5加密后转换成大写
        $sign = strtoupper(MD5($strSignTmp));

        //5.拼接成所需XML格式
        $post_data = "<xml> 
                <appid>$appid</appid> 
                <attach>$attach</attach> 
                <body>$body</body> 
                <mch_id>$mch_id</mch_id> 
                <nonce_str>$nonce_str</nonce_str> 
                <notify_url>$notify_url</notify_url> 
                <out_trade_no>$out_trade_no</out_trade_no> 
                <spbill_create_ip>$spbill_create_ip</spbill_create_ip> 
                <total_fee>$total_fee</total_fee> 
                <trade_type>$trade_type</trade_type>
                <sign>$sign</sign> 
                </xml>";

        //6.以POST方式向微信传参,并取得微信返回的支付参数
        $dataxml = $this -> httpRequest($url,&#39;POST&#39;,$post_data);
        $objectxml = (array)simplexml_load_string($dataxml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA); //将微信返回的XML转换成数组
        if($objectxml[&#39;return_code&#39;] == &#39;SUCCESS&#39;){
            if($objectxml[&#39;result_code&#39;] == &#39;SUCCESS&#39;)//如果这两个都为此状态则返回mweb_url,详情看‘统一下单’接口文档
                $return_url = "http://www.dongpaiweb.cn/mobile/WechatPay/return";//支付后跳转地址
                $urls = $objectxml[&#39;mweb_url&#39;] . &#39;&redirect_url=&#39; . urlencode($return_url);
                
                //访问这个url  但是在用下面的方法访问是 报错商家信息有误 所以我把url 放到视图中 跳转
                // header("Location:$urls");
                return view(&#39;mobile_pay&#39;,[
                    &#39;url&#39;=>$urls
                ]);
                //mweb_url是微信返回的支付连接要把这个连接分配到前台
            if($objectxml[&#39;result_code&#39;] == &#39;FAIL&#39;){
                return $err_code_des = $objectxml[&#39;err_code_des&#39;];
            }
                
        }

    }
로그인 후 복사

WeChat은 return_code 및 result_code 매개변수를 반환합니다. Return_code는 성공적인 거래가 아닌 성공적인 통신만을 나타냅니다. return_code와 result_code가 모두 SUCCESS인 경우에만 트랜잭션이 성공합니다.

마지막으로 알림 주소와 반송 주소를 구분해야 합니다. 알림 주소는 위챗에서 판매자에게 보내는 결제 알림이며 기본 결제와 동일하며 데이터 스트림 형식으로 전송됩니다. 반송 주소는 사용자가 결제한 후 점프 페이지로, 사용자가 볼 수 있는 주소입니다.

위는 WeChat H5 결제를 구현하기 위한 ThinkPHP6 도킹에 대한 소개입니다. 여러분, 어서!

위 내용은 ThinkPHP6 도킹으로 WeChat H5 결제 실현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿