検索
ホームページphp教程php手册マイクロ モール コード スニペット - WeChat パブリック アカウント支払いインターフェイス

はじめに
============================================
インターフェース名: WeChat公式アカウント支払いインターフェース
バージョン: V3.3
開発言語:PHP

========
設定手順
===========================================

1.【基本情報設定】
販売者は企業および銀行口座情報を WeChat に送信します。販売者機能が承認されると、このルーチンの設定ファイル「WxPay.pub.config.php」を見つけて、次の情報を設定できます。 appId: WeChat パブリック
作者公式サイト:www.wemallshop.com
2. [代]SDKRuntimeException.php
?
クラス SDKRuntimeException は例外 {
を拡張します パブリック関数 errorMessage()
{
return $this->getMessage();
}
}
?>
3. [代]WxPay.pub.config.php
?
/**
* WeChat支払いヘルプライブラリ
* ================================================ ===
* インターフェースには 3 種類あります:
* 【リクエストインターフェース】--Wxpay_client_
* 統合決済インターフェースクラス -- UnifiedOrder
* 注文クエリインターフェイス -- OrderQuery
* 返金アプリケーションインターフェース - 返金
* 返金クエリインターフェイス -- RefundQuery
* 請求書インターフェース -- 請求書をダウンロード
* ショートリンク変換インターフェース -- ShortUrl
* 【レスポンシブインターフェース】--Wxpay_server_
* ユニバーサル通知インターフェース -- 通知
* ネイティブ支払い - 販売者に製品情報インターフェイスを取得するよう要求 - NativeCall
*【その他】
* 静的リンク QR コード - NativeLink
* JSAPI 支払い -- JsApi
* ================================================ ====
※【CommonUtil】よく使うツール:
※trimString()、パラメータ設定時に必要な文字処理関数
* createNoncestr()、32 ビット以下のランダムな文字列を生成します
* formatBizQueryParaMap()、フォーマットパラメータ、署名プロセスに必要です
* getSign()、署名を生成します
* arrayToXml()、配列を xml に変換
* xmlToArray()、xml から配列へ
* postXmlCurl()、投稿モードで対応するインターフェイス URL に XML を送信します
* postXmlSSLCurl()、証明書を使用して、投稿モードで対応するインターフェイス URL に XML を送信します
*/
include_once("SDKRuntimeException.php");
include_once("WxPay.pub.config.php");
/**
* すべてのインターフェースの基本クラス
*/
クラス Common_util_pub
{
関数 __construct() {
}
関数trimString($value)
{
$ret = null;
if (null != $value)
{
$ret = $value;
if (strlen($ret) == 0)
{
$ret = null;
}
}
$ret を返します;
}

/**
* 機能: 32 ビット以下のランダムな文字列を生成します
*/
パブリック関数 createNoncestr( $length = 32 )
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
$str;
を返します }

/**
* 機能: 署名プロセスに必要なフォーマットパラメータ
*/
関数 formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
//$buff .= strto lower($k) . 「=」。 $v 。 "&";
$buff .= $k . 「=」。 $v 。 "&";
}
$reqPar;
if (strlen($buff) > 0)
{
$reqPar = substr($buff, 0, strlen($buff)-1);
}
$reqPar を返します;
}

/**
* 機能: 署名を生成します
*/
パブリック関数 getSign($Obj)
{
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序パラメータ
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'';
//签名步骤二:文字列の後にKEY
を追加 $String = $String."&key=".WxPayConf_pub::KEY;
//echo "【string2】".$String."";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."";
//签名步骤四:全字符转は大写
$result_ = strtoupper($String);
//echo "【結果】 ".$result_."";
$result_を返す;
}

/**
* 関数: 配列を XML に変換
*/
関数arrayToXml($arr)
{
$xml = "";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="".$val."".$key.">";
}
それ以外
$xml.="".$key.">";
}
$xml.="
";
$xml を返します。
}

/**
* 関数: XML を配列に変換します
*/
パブリック関数 xmlToArray($xml)
{
//XML を配列に変換します
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); $array_data を返す;
}
/**
* 機能: 投稿モードで対応するインターフェイス URL に XML を送信します
*/
パブリック関数 postXmlCurl($xml,$url,$秒=30)
{
//カールを初期化します
$ch =curl_init();
//タイムアウトを設定します
カール_setopt($ch, CURLOP_TIMEOUT, $秒);
//プロキシがある場合は、ここにプロキシを設定します
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//ヘッダーを設定します
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//結果が文字列であることを要求し、それを画面に出力します
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//投稿メソッド
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//カールを実行します
$data =curl_exec($ch);
curl_close($ch);
//結果を返す
if($data)
{
curl_close($ch);
$data を返します;
}
それ以外
{
$error =curl_errno($ch);
echo "カール エラー、エラー コード: $error"."
"; echo "
エラー原因クエリ
"; curl_close($ch); false を返します;
}
}
/**
* 機能: 証明書を使用して、投稿モードで対応するインターフェイス URL に XML を送信します
*/
関数 postXmlSSLCurl($xml,$url,$秒=30)
{
$ch =curl_init();
//タイムアウト期間
カール_setopt($ch,CURLOPT_TIMEOUT,$秒);
// プロキシがある場合は、ここにプロキシを設定します
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//ヘッダーを設定します
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//結果が文字列であることを要求し、それを画面に出力します
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//証明書を設定します
//証明書を使用します: 証明書とキーはそれぞれ 2 つの .pem ファイルに属します
//デフォルトの形式は PEM で、注釈を付けることができます
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH);
//デフォルトの形式は PEM で、注釈を付けることができます
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);
//投稿メソッド
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data =curl_exec($ch);
//結果を返す
if($data){
curl_close($ch);
$data を返します;
}
他 {
$error =curl_errno($ch);
echo "カール エラー、エラー コード: $error"."
"; echo "
エラー原因クエリ

"; curl_close($ch); false を返します; }
}

/**
* 関数: 配列を出力
*/
関数 printErr($wording='',$err='')
{
print_r('

');<br>
        echo $wording."";<br>
        var_dump($err);<br>
        print_r('
');
}
}
/**
* リクエストインターフェースの基本クラス
*/
クラス Wxpay_client_pub は Common_util_pub を拡張します
{
var $parameters;//リクエストパラメータ、型は連想配列
public $response; //WeChat から返された応答
public $result;//戻りパラメータ、型は連想配列
var $url;//インターフェースリンク
var $curl_timeout;//カールのタイムアウト

/**
* 機能: リクエストパラメータを設定します
*/
関数 setParameter($parameter, $parameterValue)
{
$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
}

/**
* 機能: 標準リクエストパラメーターの設定、署名の生成、インターフェースパラメーター xml の生成
*/
関数createXml()
{
$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this->parameters["nonce_str"] = $this->createNoncestr();//随机文字串
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
return $this->arrayToXml($this->parameters);
}

/**
* 機能: 投稿リクエスト XML
*/
関数postXml()
{
$xml = $this->createXml();
$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}

/**
* 機能: 証明書ポストを使用して XML をリクエストします
*/
関数postXmlSSL()
{
$xml = $this->createXml();
$this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}
/**
* 機能: 結果を取得します。デフォルトでは証明書は使用されません
*/
関数 getResult()
{
$this->postXml();
$this->result = $this->xmlToArray($this->response);
$this->result を返す;
}
}
/**
* 統合された支払いインターフェースクラス
*/
class UnifiedOrder_pub は Wxpay_client_pub を拡張します
{
関数 __construct()
{
//設置インターフェース链接
$this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//設置カール超時間
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}

/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
試してみてください
{
//检测必須充填パラメータ
if($this->parameters["out_trade_no"] == null)
{
throw new SDKRuntimeException("缺少统一支付接口必須充填パラメータout_trade_no!"."
");
}elseif($this->parameters["body"] == null){
throw new SDKRuntimeException("缺少统一支付接口必須充填パラメータbody!"."
");
}elseif ($this->parameters["total_fee"] == null ) {
throw new SDKRuntimeException("缺少统一支付接口必須充填パラメータtotal_fee!"."
");
}elseif ($this->parameters["notify_url"] == null) {
throw new SDKRuntimeException("缺少统一支付接口必須充填パラメータnotify_url!"."
");
}elseif ($this->parameters["trade_type"] == null) {
throw new SDKRuntimeException("缺少统一支付接口必須充填パラメータtrade_type!"."
");
}elseif ($this->parameters["trade_type"] == "JSAPI" &&
$this->parameters["openid"] == NULL){
throw new SDKRuntimeException("统一支付接口中,缺少必須充填パラメータopenid!trade_typeがJSAPIの場合,openidは必須充填パラメータ!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
$this->parameters["nonce_str"] = $this->createNoncestr();//随机文字串
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
return $this->arrayToXml($this->parameters);
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}

/**
* prepay_id を取得します
*/
関数getPrepayId()
{
$this->postXml();
$this->result = $this->xmlToArray($this->response);
$prepay_id = $this->result["prepay_id"];
$prepay_id を返す;
}

}
/**
*注文クエリインターフェース
*/
クラス OrderQuery_pub は Wxpay_client_pub を拡張します
{
関数 __construct()
{
//設置インターフェース链接
$this->url = "https://api.mch.weixin.qq.com/pay/orderquery";
//設置カール超時間
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}
/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
試してみてください
{
//检测必須充填パラメータ
if($this->parameters["out_trade_no"] == null &&
$this->parameters["transaction_id"] == null)
{
throw new SDKRuntimeException("注文クエリ インターフェイスで、少なくとも 1 つの out_trade_no とtransaction_id を入力してください!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->parameters["sign"] = $this->getSign($this->parameters);//署名
return $this->arrayToXml($this->parameters);
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}
}
/**
*返金申請インターフェース
*/
クラスRefund_pubはWxpay_client_pubを拡張します
{

関数 __construct() {
//インターフェースリンクを設定します
$this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
//カールのタイムアウトを設定します
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; }

/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
試してみてください
{
//必要なパラメータを検出します
if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) {
throw new SDKRuntimeException("返金アプリケーション インターフェイスで、少なくとも 1 つの out_trade_no とtransaction_id を入力してください!"."
");
}elseif($this->parameters["out_refund_no"] == null){
throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必須パラメータ out_refund_no がありません!"."
");
}elseif($this->parameters["total_fee"] == null){
throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必須パラメータ total_fee がありません!"."
");
}elseif($this->parameters["refund_fee"] == null){
throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必要なパラメータrefund_feeがありません!"."
");
}elseif($this->parameters["op_user_id"] == null){
throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必須パラメータ op_user_id がありません!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->parameters["sign"] = $this->getSign($this->parameters);//署名
return $this->arrayToXml($this->parameters);
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}
/**
* 機能: 結果の取得と証明書を使用した通信
*/
関数 getResult()
{
$this->postXmlSSL();
$this->result = $this->xmlToArray($this->response);
$this->result を返す;
}

}
/**
*返金問い合わせインターフェース
*/
class RefundQuery_pub は Wxpay_client_pub を拡張します
{

関数 __construct() {
//インターフェースリンクを設定します
$this->url = "https://api.mch.weixin.qq.com/pay/refundquery";
//カールのタイムアウトを設定します
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; }

/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
試してみてください
{
if($this->parameters["out_refund_no"] == null &&
$this->parameters["out_trade_no"] == null &&
$this->parameters["transaction_id"] == null &&
$this->parameters["refund_id "] == null)
{
throw new SDKRuntimeException("返金クエリ インターフェイスでは、4 つのパラメータ out_refund_no、out_trade_no、transaction_id、refund_id のいずれかが必要です!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->parameters["sign"] = $this->getSign($this->parameters);//署名
return $this->arrayToXml($this->parameters);
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}
/**
* 機能: 結果の取得と証明書を使用した通信
*/
関数 getResult()
{
$this->postXmlSSL();
$this->result = $this->xmlToArray($this->response);
$this->result を返す;
}
}
/**
* 請求インターフェース
*/
クラス DownloadBill_pub は Wxpay_client_pub を拡張します
{
関数 __construct()
{
//インターフェースリンクを設定します
$this->url = "https://api.mch.weixin.qq.com/pay/downloadbill";
//カールのタイムアウトを設定します
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT
}
/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
試してみてください
{
if($this->parameters["bill_date"] == null )
{
throw new SDKRuntimeException("ステートメント インターフェイスに必須パラメータ bill_date がありません!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->parameters["sign"] = $this->getSign($this->parameters);//署名
return $this->arrayToXml($this->parameters);
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}

/**
* 機能: 結果を取得します。デフォルトでは証明書は使用されません
*/
関数 getResult()
{
$this->postXml();
$this->result = $this->xmlToArray($this->result_xml);
$this->result を返す;
}


}
/**
* 短いリンク変換インターフェース
*/
クラス ShortUrl_pub は Wxpay_client_pub を拡張します
{
関数 __construct()
{
//インターフェースリンクを設定します
$this->url = "https://api.mch.weixin.qq.com/tools/shorturl";
//カールのタイムアウトを設定します
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT
}

/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
試してみてください
{
if($this->parameters["long_url"] == null )
{
throw new SDKRuntimeException("ショートリンク変換インターフェイスに、必須パラメータlong_urlがありません!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->parameters["sign"] = $this->getSign($this->parameters);//署名
return $this->arrayToXml($this->parameters);
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}

/**
* prepay_id を取得します
*/
関数getShortUrl()
{
$this->postXml();
$prepay_id = $this->result["short_url"];
$prepay_id を返します;
}

}
/**
*レスポンシブインターフェイスの基本クラス
*/
クラス Wxpay_server_pub は Common_util_pub を拡張します
{
public $data;//受信したデータは連想配列型です
var $returnParameters;//パラメータを返します、型は連想配列です

/**
* データ処理を容易にするために、WeChat のリクエスト XML を連想配列に変換します
*/
関数 saveData($xml)
{
$this->data = $this->xmlToArray($xml);
}

関数 checkSign()
{
$tmpData = $this->data;
unset($tmpData['sign']);
$sign = $this->getSign($tmpData);//ローカル署名
if ($this->data['sign'] == $sign) {
TRUE を返します;
}
FALSE を返します;
}

/**
* WeChatリクエストデータを取得します
*/
関数getData()
{
$this->data を返す;
}

/**
* WeChatに返されるxmlデータを設定します
*/
関数 setReturnParameter($parameter, $parameterValue)
{
$this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
}

/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
return $this->arrayToXml($this->returnParameters);
}

/**
* xmlデータをWeChatに返します
*/
関数 returnXml()
{
$returnXml = $this->createXml();
$returnXml を返す;
}
}
/**
* ユニバーサル通知インターフェース
*/
Notify_pub クラスは Wxpay_server_pub を拡張します
{
}
/**
* 加盟店に製品情報インターフェースの取得をリクエストします
*/
class NativeCall_pub は Wxpay_server_pub を拡張します
{
/**
* インターフェースパラメータxmlを生成
*/
関数createXml()
{
if($this->returnParameters["return_code"] == "成功"){
$this->returnParameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->returnParameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$this->returnParameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->returnParameters["sign"] = $this->getSign($this->returnParameters);//署名
}
return $this->arrayToXml($this->returnParameters);
}

/**
* product_id を取得します
*/
関数getProductId()
{
$product_id = $this->data["product_id"];
$product_id を返します;
}

}
/**
*静的リンクQRコード
*/
class NativeLink_pub は Common_util_pub を拡張します
{
var $parameters; //静的リンクパラメータ
var $url; //静的リンク
関数 __construct()
{
}

/**
*パラメータを設定します
*/
関数 setParameter($parameter, $parameterValue)
{
$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
}

/**
* ネイティブ支払いリンク QR コードを生成します
*/
関数createLink()
{
試してみてください
{
if($this->parameters["product_id"] == null)
{
throw new SDKRuntimeException("ネイティブ決済 QR コード リンクの必須パラメータ product_id が見つかりません!"."
");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//パブリックアカウントID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID
$time_stamp = time();
$this->parameters["time_stamp"] = "$time_stamp";//タイムスタンプ
$this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列
$this->parameters["sign"] = $this->getSign($this->parameters);//署名
$bizString = $this->formatBizQueryParaMap($this->parameters, false);
$this->url = "weixin://wxpay/bizpayurl?".$bizString;
}キャッチ (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}

/**
*リターンリンク
*/
関数getUrl()
{
$this->createLink();
$this->url を返す;
}
}
/**
* JSAPI 支払い—H5 Web ページで支払いインターフェースが起動します
*/
class JsApi_pub は Common_util_pub を拡張します
{
var $code;//openid を取得するためのコードをコード化します
var $openid;//ユーザーのopenid
var $parameters;//jsapi パラメータ、形式は json
var $prepay_id;// 統合された支払いインターフェースを使用して取得された前払い ID
var $curl_timeout;//カールのタイムアウト
関数 __construct()
{
//カールのタイムアウトを設定します
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}

/**
* 機能: コードを取得できる URL を生成します
*/
関数 createOauthUrlForCode($redirectUrl)
{
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "コード";
$urlObj["スコープ"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this->formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
}
/**
* 機能: openidを取得できるURLを生成
*/
関数 createOauthUrlForOpenid()
{
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["シークレット"] = WxPayConf_pub::APPSECRET;
$urlObj["コード"] = $this->コード;
$urlObj["grant_type"] = "authorization_code";
$bizString = $this->formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;
}


/**
* 機能: openid を取得するために、curl を通じてコードを WeChat に送信します
*/
関数getOpenid()
{
$url = $this->createOauthUrlForOpenid();
//curlを初期化します
$ch =curl_init();
//タイムアウトを設定します
curl_setopt($ch, CURLOP_TIMEOUT, $this->curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this->openid = $data['openid'];
return $this->openid;
}
/**
* 作用:设置prepay_id
*/
function setPrepayId($prepayId)
{
$this->prepay_id = $prepayId;
}
/**
* 作用:设置code
*/
function setCode($code_)
{
$this->code = $code_;
}
/**
* 作用:设置jsapi的参数
*/
public function getParameters()
{
$jsApiObj["appId"] = WxPayConf_pub::APPID;
$timeStamp = time();
$jsApiObj["timeStamp"] = "$timeStamp";
$jsApiObj["nonceStr"] = $this->createNoncestr();
$jsApiObj["package"] = "prepay_id=$this->prepay_id";
$jsApiObj["signType"] = "MD5";
$jsApiObj["paySign"] = $this->getSign($jsApiObj);
$this->parameters = json_encode($jsApiObj);

return $this->parameters;
}
}
?>
5. [代码]download_bill.php
?
/**
* 对账单接口demo
* ====================================================
* 商户可以通过该接口下载历史交易清单。
*/
include_once("../WxPayPubHelper/WxPayPubHelper.php");
//对账单日期
if (!isset($_POST["bill_date"])){
$bill_date = "20140814";
}
else{
$bill_date = $_POST["bill_date"];

//使用对账单接口
$downloadBill = new DownloadBill_pub();
//设置对账单接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//sign已填,商户无需重复填写
$downloadBill->setParameter("bill_date","$bill_date");//对账单日期
$downloadBill->setParameter("bill_type","ALL");//账单类型
//非必填参数,商户可根据实际情况选填
//$downloadBill->setParameter("device_info","XXXX");//设备号

//对账单接口结果
$downloadBillResult = $downloadBill->getResult();
echo $downloadBillResult['return_code'];

if ($downloadBillResult['return_code'] == "FAIL") {
echo "通信出错:".$downloadBillResult['return_msg'];
}else{
print_r('
');<br>
             echo "【对账单详情】"."";<br>
             print_r($downloadBill->response);<br>
             print_r('
');
}
}

?>





微信安全支付





对账单查询


日期(格式:20140101):






返回首页


?>



6. [コード]index.php
?




WeChatの安全な支払い








7. [コード]js_api_call.php
?
/**
* JS_API 支払いデモ
* ================================================ ===
* WeChat ブラウザで H5 Web ページを開き、JS を実行して支払いを開始します。インターフェースの入出力データ形式はJSONです。
* 支払いを正常に有効にするには 3 つの手順が必要です:
* ステップ 1: Web ページ認証を通じてユーザー openid を取得します
* ステップ 2: 統合支払いインターフェースを使用して prepay_id を取得します
* ステップ 3: jsapi を使用して支払いを開始します
*/
include_once("./WxPayPubHelper/WxPayPubHelper.php");

//jsapi インターフェースを使用します
$jsApi = 新しい JsApi_pub();
//==========ステップ 1: Web ページ認証経由でユーザー openid を取得============
// コードを通じて openid を取得します
if (!isset($_GET['code']))
{
//WeChat リターン コードをトリガーします
$url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
ヘッダー("場所: $url"); }その他
{
// openid を取得するコード code を取得します
$code = $_GET['code'];
$jsApi->setCode($code);
$openid = $jsApi->getOpenId();
}

//==========ステップ 2: 統合支払いインターフェースを使用して prepay_id を取得します============
// 統一された支払いインターフェースを使用します
$unifiedOrder = new UnifiedOrder_pub();

// 統合された支払いインターフェースのパラメーターを設定します
//必要なパラメータを設定します
//appid は入力されています。販売者は再度入力する必要はありません
//mch_id は入力されています。販売者は再度入力する必要はありません
//noncestr は入力されています。販売者は再度入力する必要はありません
//spbill_create_ip は入力されています。販売者は再度入力する必要はありません
//署名は入力されています。販売者は再度入力する必要はありません
$body = $_GET["本体"];
$out_trade_no = $_GET["注文ID"];
$total_fee = $_GET["合計価格"];
$url = $_GET["url"];
$unifiedOrder->setParameter("openid","$openid");//商品説明
$unifiedOrder->setParameter("body","$body");//商品説明
//注文番号をカスタマイズします。これは単なる例です
// $timeStamp = time();
// $out_trade_no = WxPayConf_pub::APPID."$timeStamp";
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//販売者の注文番号
$unifiedOrder->setParameter("total_fee","$total_fee");//合計金額
$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知アドレス
$unifiedOrder->setParameter("trade_type","JSAPI");//トランザクションタイプ

//必須ではないパラメータ。販売者は実際の状況に応じて入力することを選択できます
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//サブマーチャント番号
//$unifiedOrder->setParameter("device_info","XXXX");//デバイス番号
//$unifiedOrder->setParameter("attach","XXXX");//追加データ
//$unifiedOrder->setParameter("time_start","XXXX");//トランザクション開始時間
//$unifiedOrder->setParameter("time_expire","XXXX");//トランザクション終了時刻
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品タグ
//$unifiedOrder->setParameter("openid","XXXX");//ユーザーID
//$unifiedOrder->setParameter("product_id","XXXX");//製品ID
$prepay_id = $unifiedOrder->getPrepayId();
//==========ステップ 3: jsapi を使用して支払いを開始する============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
//エコー $jsApiParameters;
?>





WeChatの安全な支払い





8. [コード]log_.php
?
クラスログ_ {
// ログを印刷します
関数 log_result($file,$word)
{
$fp = fopen($file,"a");
群れ($fp, LOCK_EX) ;
fwrite($fp,"実行日:".strftime("%Y-%m-%d-%H:%M:%S",time())."n".$word."nn");
群れ($fp, LOCK_UN);
fclose($fp);
}
}
?>
9. [コード]native_call.php
?
/** *ネイティブ(ネイティブ)決済モードのデモ
* ================================================ ===
*モード1: 販売者が固定形式のリンクQRコードを生成し、ユーザーがコードをスキャンしてWeChatを調整します
※加盟店が設定したリンクにproductidとユーザーopenidが送信され、加盟店が受け取ります
* 注文の生成をリクエストし、統合支払いインターフェースを呼び出して注文し、WeChat に送信すると、WeChat が戻ります
* 販売者にプリペイド ID を付与します。
* このルーチンに対応する QR コードは、native_call_qrcode.php によって生成されます。 ※このルーチンに対応するレスポンスサービスはnative_call.php;
※両方を併用する必要があります。
*
*/
include_once("./log_.php");
include_once("../WxPayPubHelper/WxPayPubHelper.php");

//デバッグ用にコールバック情報をログファイルの形式で記録します
$log_ = 新しい Log_();
$log_name="./native_call.log";
//ネイティブ通知インターフェースを使用します
$nativeCall = 新しい NativeCall_pub();
//WeChatリクエストを受信します
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$log_->log_result($log_name,"[受信したネイティブ通知]:n".$xml."n");
$nativeCall->saveData($xml);

if($nativeCall->checkSign() == FALSE){
$nativeCall->setReturnParameter("return_code","FAIL");//ステータスコードを返す
$nativeCall->setReturnParameter("return_msg","Signature failed");//情報を返します
}その他{
//product_id を抽出します
$product_id = $nativeCall->getProductId();

// 統一された支払いインターフェースを使用します
$unifiedOrder = new UnifiedOrder_pub();

// 異なる $product_id に応じて、対応する注文パラメータを設定します。これは 1 つの例にすぎません
。 スイッチ ($product_id)
{
case WxPayConf_pub::APPID."static"://は、native_call_qrcode.phpの静的リンクQRコードに対応します
// 統合された支払いインターフェースのパラメーターを設定します
//必要なパラメータを設定します
//appid は入力されています。販売者は再度入力する必要はありません
//mch_id は入力されています。販売者は再度入力する必要はありません
//noncestr は入力されています。販売者は再度入力する必要はありません
//spbill_create_ip は入力されています。販売者は再度入力する必要はありません
//署名は入力されています。販売者は再度入力する必要はありません
$unifiedOrder->setParameter("body","寄付金");//商品説明
//注文番号をカスタマイズします。これは単なる例です
$timeStamp = 時間();
$out_trade_no = WxPayConf_pub::APPID."$timeStamp";
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//販売者の注文番号 $unifiedOrder->setParameter("product_id","$product_id");//商品 ID
$unifiedOrder->setParameter("total_fee","1");//合計金額
$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知アドレス
$unifiedOrder->setParameter("trade_type","NATIVE");//取引タイプ
$unifiedOrder->setParameter("product_id","$product_id");//ユーザーID
//必須ではないパラメータ。販売者は実際の状況に応じて入力することを選択できます
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//サブマーチャント番号
//$unifiedOrder->setParameter("device_info","XXXX");//デバイス番号
//$unifiedOrder->setParameter("attach","XXXX");//追加データ
//$unifiedOrder->setParameter("time_start","XXXX");//トランザクション開始時間
//$unifiedOrder->setParameter("time_expire","XXXX");//トランザクション終了時刻
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品タグ
//$unifiedOrder->setParameter("openid","XXXX");//ユーザーID

//prepay_id を取得します
$prepay_id = $unifiedOrder->getPrepayId();
//リターンコードを設定します
//必要なパラメータを設定します
//appid は入力されています。販売者は再度入力する必要はありません
//mch_id は入力されています。販売者は再度入力する必要はありません
//noncestr は入力されています。販売者は再度入力する必要はありません
//署名は入力されています。販売者は再度入力する必要はありません
$nativeCall->setReturnParameter("return_code","SUCCESS");//ステータスコードを返す
$nativeCall->setReturnParameter("result_code","SUCCESS");//ビジネス結果
$nativeCall->setReturnParameter("prepay_id","$prepay_id");//前払い ID

休憩;
デフォルト:
//リターンコードを設定します
//必要なパラメータを設定します
//appid は入力されています。販売者は再度入力する必要はありません
//mch_id は入力されています。販売者は再度入力する必要はありません
//noncestr は入力されています。販売者は再度入力する必要はありません
//署名は入力されています。販売者は再度入力する必要はありません
$nativeCall->setReturnParameter("return_code","SUCCESS");//ステータスコードを返す
$nativeCall->setReturnParameter("result_code","FAIL");//ビジネス結果
$nativeCall->setReturnParameter("err_code_des","この商品は無効です");//業績
休憩;
}
}

//結果を WeChat に返します
$returnXml = $nativeCall->returnXml();
$log_->log_result($log_name,"[WeChat のネイティブ応答に戻る]:n".$returnXml."n");
エコー $returnXml;

//取引完了
?>
10. [コード]native_call_qrcode.php [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [ 14] [15] [16] [全画面プレビュー]
?
/**
*ネイティブ(ネイティブ)決済モードのデモ
* ================================================ ===
*モード1: 販売者が固定形式のリンクQRコードを生成し、ユーザーがコードをスキャンしてWeChatを調整します
※加盟店が設定したリンクにproductidとユーザーopenidが送信され、加盟店が受け取ります
* 注文の生成をリクエストし、統合支払いインターフェースを呼び出して注文し、WeChat に送信すると、WeChat が戻ります
* 販売者にプリペイド ID を付与します。
* このルーチンに対応する QR コードは、native_call_qrcode.php によって生成されます。 ※このルーチンに対応するレスポンスサービスはnative_call.php;
※両方を併用する必要があります。
*/
include_once("../WxPayPubHelper/WxPayPubHelper.php");
//静的リンクを設定します
$nativeLink = 新しい NativeLink_pub();
//静的リンクパラメータを設定します
//必要なパラメータを設定します
//appid は入力されています。販売者は再度入力する必要はありません
//mch_id は入力されています。販売者は再度入力する必要はありません
//noncestr は入力されています。販売者は再度入力する必要はありません
//time_stamp は入力されています。販売者は再度入力する必要はありません
//署名は入力されています。販売者は再度入力する必要はありません
$product_id = WxPayConf_pub::APPID."static";//カスタマイズされた製品 ID
$nativeLink->setParameter("product_id","$product_id");//商品ID
//リンクを取得
$product_url = $nativeLink->getUrl();
//ショートリンク変換インターフェースを使用します
$shortUrl = 新しい ShortUrl_pub();
//必要なパラメータを設定します
//appid は入力されています。販売者は再度入力する必要はありません
//mch_id は入力されています。販売者は再度入力する必要はありません
//noncestr は入力されています。販売者は再度入力する必要はありません
//署名は入力されています。販売者は再度入力する必要はありません
$shortUrl->setParameter("long_url","$product_url");//URL リンク
//ショートリンクを取得します
$codeUrl = $shortUrl->getShortUrl();

?>






WeChatの安全な支払い



スキャンして、スキャンして



ホームページに戻る



<script><br /> var url = "<?php echo $product_url;?>";<br /> //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围&#039;L&#039;,&#039;M&#039;,&#039;Q&#039;,&#039;H&#039;<br /> var qr = qrcode(10, &#039;M&#039;);<br /> qr.addData(url);<br /> qr.make();<br /> var dom=document.createElement(&#039;DIV&#039;);<br /> dom.innerHTML = qr.createImgTag();<br /> var element=document.getElementById("qrcode");<br /> element.appendChild(dom);<br /> </script>

11. [代码]native_dynamic_qrcode.php
?
/**
* Native(原生)支付-模式二-demo
* ====================================================
* 商户生成订单,先调用统一支付接口获取到code_url,
* 此URL直接生成二维码,用户扫码后调起支付。
*
*/
include_once("../WxPayPubHelper/WxPayPubHelper.php");
//使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();

//设置统一支付接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//spbill_create_ip已填,商户无需重复填写
//sign已填,商户无需重复填写
$unifiedOrder->setParameter("body","贡献一分钱");//商品描述
//自定义订单号,此处仅作举例
$timeStamp = time();
$out_trade_no = WxPayConf_pub::APPID."$timeStamp";
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
$unifiedOrder->setParameter("total_fee","1");//总金额
$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
//非必填参数,商户可根据实际情况选填
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
//$unifiedOrder->setParameter("device_info","XXXX");//设备号
//$unifiedOrder->setParameter("attach","XXXX");//附加数据
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
//$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
//$unifiedOrder->setParameter("openid","XXXX");//用户标识
//$unifiedOrder->setParameter("product_id","XXXX");//商品ID

//获取统一支付接口结果
$unifiedOrderResult = $unifiedOrder->getResult();

//商户根据实际情况设置相应的处理流程
if ($unifiedOrderResult["return_code"] == "FAIL")
{
//商户自行增加处理流程
echo "通信出错:".$unifiedOrderResult['return_msg']."
";
}
elseif($unifiedOrderResult["result_code"] == "FAIL")
{
//商户自行增加处理流程
echo "错误代码:".$unifiedOrderResult['err_code']."
";
echo "错误代码描述:".$unifiedOrderResult['err_code_des']."
";
}
elseif($unifiedOrderResult["code_url"] != NULL)
{
//从统一支付接口获取到code_url
$code_url = $unifiedOrderResult["code_url"];
//商户自行增加处理流程
//......
}
?>






微信安全支付





订单号:





















返回首页



<script><br /> if(<?php echo $unifiedOrderResult["code_url"] != NULL; ?>)<br /> {<br /> var url = "<?php echo $code_url;?>";<br /> //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围&#039;L&#039;,&#039;M&#039;,&#039;Q&#039;,&#039;H&#039;<br /> var qr = qrcode(10, &#039;M&#039;);<br /> qr.addData(url);<br /> qr.make();<br /> var wording=document.createElement(&#039;p&#039;);<br /> wording.innerHTML = "扫我,扫我";<br /> var code=document.createElement(&#039;DIV&#039;);<br /> code.innerHTML = qr.createImgTag();<br /> var element=document.getElementById("qrcode");<br /> element.appendChild(wording);<br /> element.appendChild(code);<br /> }<br /> </script>

12. [代码]notify_url.php
?
/**
* 通用通知接口demo
* ====================================================
* 支付完成后,微信会把相关支付和用户信息发送到商户设定的通知URL,
* 商户接收回调信息后,根据需要设定相应的处理流程。
*
* 这里举例使用log文件形式记录回调信息。
*/
include_once("./log_.php");
include_once("./WxPayPubHelper/WxPayPubHelper.php");
include_once('../../Public/Conf/config.php');

//使用通用通知接口
$notify = new Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);

//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
if($notify->checkSign() == FALSE){
$notify->setReturnParameter("return_code","FAIL");//返回状态码
$notify->setReturnParameter("return_msg","签名失败");//返回信息
}else{
$notify->setReturnParameter("return_code","SUCCESS");//设置返回码
}
$returnXml = $notify->returnXml();
echo $returnXml;
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======

//以log文件形式记录回调信息
$log_ = new Log_();
$log_name="./notify_url.log";//log文件路径
$log_->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
if($notify->checkSign() == TRUE)
{
if ($notify->data["return_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
$log_->log_result($log_name,"【通信出错】:\n".$xml."\n");
}
elseif($notify->data["result_code"] == "FAIL"){
//此处应该更新一下订单状态,商户自行增删操作
$log_->log_result($log_name,"【业务出错】:\n".$xml."\n");
}
else{
//此处应该更新一下订单状态,商户自行增删操作
$log_->log_result($log_name,"【支付成功】:\n".$xml."\n");
}
//商户自行增加处理流程,
//例如:更新订单状态
//例如:数据库操作
//例如:推送支付完成信息
$xml = $notify->xmlToArray($xml);
// 商户订单号
$out_trade_no = $xml ['out_trade_no'];
$total_fee = $xml ['total_fee'];
$uid = $xml ['openid'];
$log_->log_result($log_name,"【订单号】:\n".$out_trade_no."\n");
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序
if (! empty ( $out_trade_no )) {
$sql = "update " . DB_PREFIX . "order set pay_status=1 where orderid='" . $out_trade_no . "'";
mysql_query ( $sql, $conn );
}
}
?>
13. [代码]order_query.php
?
/**
* 订单查询-demo
* ====================================================
* 该接口提供所有微信支付订单的查询。
* 当支付通知处理异常或丢失的情况,商户可以通过该接口查询订单支付状态。
*
*/
include_once("../WxPayPubHelper/WxPayP
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン