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