Pre-development configuration

Before code access, you need to fill in the authorization callback domain name in wechat background, which must be put on record by ICP

Main development process

  • Users choose wechat Pay when placing an order
  • The merchant conducts business logic processing and invokes wechat unified ordering interface. The transaction type of wechat H5 is trade_type=MWEB
  • When the order interface is successfully invoked, wechat will return relevant parameters including the payment jump URL, and merchants will use the parameter Mweb_URL to pull up the payment middle page
  • Wechat will verify H5 permissions on the middle page
  • If the payment is successful, wechat will send an asynchronous notification of the result to the merchant

Official development

Adjust wechat pay, only state the necessary parameters

Request WeChat unified interface, the interface address: api.mch.weixin.qq.com/pay/unified…

Interface request parameters
  • Appid: wechat official iD
  • McH_id: indicates the account id
  • Nonce_str: a random string of less than 32 characters
  • Signature sign:
  • Body: Product description
  • Out_trade_no: merchant order number, no longer than 32 digits
  • Total_fee: Total amount, divided into units
  • Spbill_create_ip: INDICATES the IP address when the client requests payment
  • Notify_url: address for asynchronous notification callback. It must be a directly accessible address and cannot carry parameters
  • Trade_type: trade type, such as H5MWEB

These are the parameters required for H5 to pay the order

Signature is generated
  • The parameters involved in generating the signature must be non-null
  • Parameters are sorted in alphabetical order based on the ASCII code, and parameter names are case-sensitive
  • According to the above rules, the parameters are spliced into k1=v1&k2=v2…. The string
  • Add key to the string obtained in the previous step, for example, k1=v1& K2 =v2&key= 192006250b4c09247EC02E
  • Then, MD5 encryption is performed on the final obtained string, and then uppercase, which is the final sign value

Code:

    /** * create signature *@paramArray $params request parameter *@paramString $key Key */
    public function genSign($params, $key)
    {
        foreach ($params as $k=>$v) {
            if(! $v) {unset($params[$k]);
            }
        }
        ksort($params);
        $paramStr = ' ';
        foreach ($params as $k => $v) {
            $paramStr = $paramStr . $k . '=' . $v . '&';
        }
        $paramStr = $paramStr . 'key='.$key;
        $sign = strtoupper(md5($paramStr));
        return $sign;
    }
Copy the code
The initiating

Convert the parameters to XML data to initiate a request to convert the array to XML:

    /** * convert an array to XML *@paramArray $params payment request parameter */
    public function array_to_xml($params)
    {
        if(! is_array($params)|| count($params) <=0) {
            return false;
        }
        $xml = "<xml>";
        foreach ($params as $key=>$val) {
            if (is_numeric($val)) {
                $xml.="<".$key.">".$val."< /".$key.">";
            } else {
                $xml.="<".$key."> 
      .$val."]] > "/".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }
Copy the code

Request code:

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $return = curl_exec($ch);
        curl_close($ch);
        return $return;
Copy the code

Wechat returns XML data:

<xml><return_code><! [CDATA[SUCCESS]]></return_code>
<return_msg><! [CDATA[OK]]></return_msg>
<appid><! [CDATA[wxdded766660f9b840]]></appid>
<mch_id><! [CDATA[1516216351]]></mch_id>
<device_info><! [CDATA[100]]></device_info>
<nonce_str><! [CDATA[2DUN2i2pGnlC6vDi]]></nonce_str>
<sign><! [CDATA[95CEA831D598299097A32D8FEEC6BDEF]]></sign>
<result_code><! [CDATA[SUCCESS]]></result_code>
<prepay_id><! [CDATA[wx22194530678545eb3713f2f10724143329]]></prepay_id>
<trade_type><! [CDATA[MWEB]]></trade_type>
<mweb_url><! [CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx22194530678545eb3713f2f10724143329&package=87106 983]] ></mweb_url>
Copy the code

Return_code for SUCCESS indicates that the payment request was successful; Mweb_url is the payment jump page. At this time, the client can already adjust wechat Pay through mweb_URL

Middle page processing

After receiving the mweb_URL parameter returned by wechat, you can further obtain the deepLink code on the server side:

    /** * Get deepLink parameters * from the middle page of wechat Pay@paramString $URL Mweb_URL * returned by wechat@paramString $IP Client IP */
    public function getDeeplink(string $url, string $ip)
    {
        $headers = array("X-FORWARDED-FOR:$ip"."CLIENT-IP:$ip");
        ob_start();
        $ch = curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_HTTPHEADER , $headers );
        curl_setopt ($ch, CURLOPT_REFERER, "pay.o9di.cn");
        curl_setopt( $ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'the Mozilla / 5.0 (Linux; Android 6.0.1; OPPO R11s Build/MMB29M; Wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36');
        curl_exec($ch);
        curl_close ($ch);
        $out = ob_get_contents();
        ob_clean();
        $a = preg_match('/weixin:\/\/wap.*/',$out, $str);
        if ($a) {
            return substr($str[0].0, strlen($str[0])- 1);
        } else {
            return ' '; }}Copy the code

weixin://wap/pay? prepayid%3Dwx22201221074146ac747121890095299503&package=2656135616&noncestr=1542888966&sign=e31dbc2d1231708ff8a982b15a6c 7646 is the deepLink value obtained, and the client can also directly call the payment from this value