Wechat official account payment request to jump to code cross-domain

1. Develop the official account payment of Wechat Mall, and the front end initiates the order from the ajax request to the server. The server then initiates the payment after obtaining the openid. A cross-domain exception occurred in the first step of obtaining the openid. Here is part of the code:

header("Access-Control-Allow-Origin: *");
header("Content-type:text/html; Charset=utf-8");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header("Access-Control-Allow-Methods: GET, POST, PUT,DELETE");
$mchid = "123456789622";          // PartnerID 
$appid = "dsalkdfjkldjsf154";  //APPID
$appKey = "43das153d43as5";   //APP Key
$apiKey = "as4das5d745as7d6a7";   //https://pay.weixin.qq.com --API-API-API
//openid
$wxPay = new WxpayService($mchid, $appid, $appKey, $apiKey);
$openId = $wxPay->GetOpenid();      //openid
if (!$openId) exit("openid");
--------------------------------
$input = @file_get_contents("php://input");
$requestArr = json_decode($input, true);
if (empty($requestArr)) {
    echo "";
    return;
}
//
-----------------
class WxpayService
{
    protected $mchid;
    protected $appid;
    protected $appKey;
    protected $apiKey;
    public $data = null;

    public function __construct($mchid, $appid, $appKey, $key)
    {
        $this->mchid = $mchid; //https://pay.weixin.qq.com --
        $this->appid = $appid; //APPID
        $this->appKey = $appKey; //APP Key
        $this->apiKey = $key;   //https://pay.weixin.qq.com --API-API-API
    }

    /**
     * openid:
     * 1urlhttps://open.weixin.qq.com/connect/oauth2/authorize
     * 2redirect_uri:code
     * @return openid
     */
    public function GetOpenid()
    {
        //codeopenid
        if (!isset($_GET["code"])) {
            //code
            $scheme = $_SERVER["HTTPS"] == "on" ? "https://" : "http://";
            $baseUrl = urlencode($scheme . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"] . $_SERVER["QUERY_STRING"]);
            $url = $this->__CreateOauthUrlForCode($baseUrl);
            Header("Location: $url");
            exit();
        } else {
            //codeopenid
            $code = $_GET["code"];
            $openid = $this->getOpenidFromMp($code);
            return $openid;
        }
    }

    /**
     * codeopenidaccess_token
     * @param string $code code
     * @return openid
     */
    public function GetOpenidFromMp($code)
    {
        $url = $this->__CreateOauthUrlForOpenid($code);
        $res = self::curlGet($url);
        //openid
        $data = json_decode($res, true);
        $this->data = $data;
        $openid = $data["openid"];
        return $openid;
    }

    /**
     * openaccess_tokeurl
     * @param string $codecode
     * @return url
     */
    private function __CreateOauthUrlForOpenid($code)
    {
        $urlObj["appid"] = $this->appid;
        $urlObj["secret"] = $this->appKey;
        $urlObj["code"] = $code;
        $urlObj["grant_type"] = "authorization_code";
        $bizString = $this->ToUrlParams($urlObj);
        return "https://api.weixin.qq.com/sns/oauth2/access_token?" . $bizString;
    }

    /**
     * codeurl
     * @param string $redirectUrl urlurl
     * @return url
     */
    private function __CreateOauthUrlForCode($redirectUrl)
    {
        $urlObj["appid"] = $this->appid;
        $urlObj["redirect_uri"] = "$redirectUrl";
        $urlObj["response_type"] = "code";
        $urlObj["scope"] = "snsapi_base";
        $urlObj["state"] = "STATE" . "-sharpwechat_redirect";
        $bizString = $this->ToUrlParams($urlObj);
        return "https://open.weixin.qq.com/connect/oauth2/authorize?" . $bizString;
    }

    /**
     * 
     * @param array $urlObj
     * @return 
     */
    private function ToUrlParams($urlObj)
    {
        $buff = "";
        foreach ($urlObj as $k => $v) {
            if ($k != "sign") $buff .= $k . "=" . $v . "&";
        }
        $buff = trim($buff, "&");
        return $buff;
    }

    /**
     * 
     * @param string $openid Openid
     * @param float $totalFee  
     * @param string $outTradeNo 
     * @param string $orderName 
     * @param string $notifyUrl url 
     * @param string $timestamp 
     * @return string
     */
    public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)
    {
        $config = array(
            "mch_id" => $this->mchid,
            "appid" => $this->appid,
            "key" => $this->apiKey,
        );
        $orderName = iconv("GBK", "UTF-8", $orderName);
        $unified = array(
            "appid" => $config["appid"],
            "attach" => "pay",             //utf-8
            "body" => $orderName,
            "mch_id" => $config["mch_id"],
            "nonce_str" => self::createNonceStr(),
            "notify_url" => $notifyUrl,
            "openid" => $openid,            //rade_type=JSAPI
            "out_trade_no" => $outTradeNo,
            "spbill_create_ip" => "127.0.0.1",
            "total_fee" => intval($totalFee * 100),       // 
            "trade_type" => "JSAPI",
        );
        $unified["sign"] = self::getSign($unified, $config["key"]);
        $responseXml = self::curlPost("https://api.mch.weixin.qq.com/pay/unifiedorder", self::arrayToXml($unified));
        $unifiedOrder = simplexml_load_string($responseXml, "SimpleXMLElement", LIBXML_NOCDATA);
        if ($unifiedOrder === false) {
            die("parse xml error");
        }
        if ($unifiedOrder->return_code != "SUCCESS") {
            die($unifiedOrder->return_msg);
        }
        if ($unifiedOrder->result_code != "SUCCESS") {
            die($unifiedOrder->err_code);
        }
        $arr = array(
            "appId" => $config["appid"],
            "timeStamp" => "$timestamp",        //int
            "nonceStr" => self::createNonceStr(),
            "package" => "prepay_id=" . $unifiedOrder->prepay_id,
            "signType" => "MD5",
        );
        $arr["paySign"] = self::getSign($arr, $config["key"]);
        return $arr;
    }

    public static function curlGet($url = "", $options = array())
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }

    public static function curlPost($url = "", $postData = "", $options = array())
    {
        if (is_array($postData)) {
            $postData = http_build_query($postData);
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //cURL
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }
        //https host
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }

    public static function createNonceStr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $iPP) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    public static function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            if (is_numeric($val)) {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            } else
                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
        }
        $xml .= "</xml>";
        return $xml;
    }

    public static function getSign($params, $key)
    {
        ksort($params, SORT_STRING);
        $unSignParaString = self::formatQueryParaMap($params, false);
        $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
        return $signStr;
    }

    protected static function formatQueryParaMap($paraMap, $urlEncode = false)
    {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v) {
            if (null != $v && "null" != $v) {
                if ($urlEncode) {
                    $v = urlencode($v);
                }
                $buff .= $k . "=" . $v . "&";
            }
        }
        $reqPar = "";
        if (strlen($buff) > 0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }
}

3.XMLHttpRequest cannot load https://open.weixin.qq.com/co. Response for preflight is invalid (redirect)
can now almost be located in Header ("Location: $url"); the error that occurs here. After searching around, there was no result.
4. This is almost official demo plus business logic


< H2 > you need to figure out the process for Wechat to place an order. Wechat needs openid to place an order. How can I get openid ? < / H2 >

the openid parameter is required for WeChat Pay to place an order, and the oauth jump is required to obtain the openid (the openid stitching returned by the menu is not considered here).
should only use the code for issuing the order. What you need to do now is to implement how to get openid, and then go to Wechat to issue an order to get jspayinfo,. You jump directly with demo, and ajax gets the information of another domain name. Cross-domain is not available.


the same problem has not been solved. It has been almost a day


I do third-party login to get code cross-domain

.
MySQL Query : SELECT * FROM `codeshelper`.`v9_news` WHERE status=99 AND catid='6' ORDER BY rand() LIMIT 5
MySQL Error : Disk full (/tmp/#sql-temptable-64f5-1bc8872-38cb2.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
MySQL Errno : 1021
Message : Disk full (/tmp/#sql-temptable-64f5-1bc8872-38cb2.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
Need Help?