<?php
const APPID =
'xxxxxxxxxxxxxxxxxx'
;
const MCHID =
'xxxxxxxxxxx'
;
const KEY =
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
;
const APPSECRET =
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
;
/**
*
* 拼接簽名字符串
* @param array $urlObj
* @return 返回已經(jīng)拼接好的字符串
*/
function
ToUrlParams($urlObj)
{
$buff =
""
;
foreach ($urlObj as $k => $v)
{
if
($k !=
"sign"
){
$buff .= $k .
"="
. $v .
"&"
;
}
}
$buff = trim($buff,
"&"
);
return
$buff;
}
/**
* 統(tǒng)一下單,WxPayUnifiedOrder中out_trade_no、body、total_fee、trade_type必填
* appid、mchid、spbill_create_ip、nonce_str不需要填入
* @param WxPayUnifiedOrder $inputObj
* @param int $timeOut
* @throws WxPayException
* @return 成功時(shí)返回,其他拋異常
*/
function
unifiedOrder( $timeOut = 6)
{
$datas = array();
$datas[
'body'
] =
'賣王文曉啦,一分一個(gè)'
;
$datas[
'out_trade_no'
] =
'1234567890123456789012'
;
//訂單號(hào)
$datas[
'total_fee'
] =
'1'
;
$datas[
'time_start'
] = date(
"YmdHis"
);
$datas[
'time_expire'
] = date(
"YmdHis"
, time() + 600);
$datas[
'appid'
] = APPID;
//公眾賬號(hào)ID
$datas[
'mch_id'
] = MCHID;
//商戶號(hào)
$datas[
'spbill_create_ip'
] = $_SERVER[
'REMOTE_ADDR'
];
//ip
$datas[
'nonce_str'
] = getNonceStr();
//隨機(jī)字符串
//簽名步驟一:按字典序排序參數(shù)
ksort($datas);
$string = ToUrlParamss($datas);
//簽名步驟二:在string后加入KEY
$string = $string .
"&key="
.KEY;
//簽名步驟三:MD5加密
$string = md5($string);
//簽名步驟四:所有字符轉(zhuǎn)為大寫
$result = strtoupper($string);
$datas[
'sign'
] = $result;
//簽名
$xml = ToXml($datas);
$response = postXmlCurl($xml, $url,
false
, $timeOut);
$data = FromXml($response);
var_dump($data);
return
$data;
}
/**
* 產(chǎn)生隨機(jī)字符串,不長(zhǎng)于32位
* @param int $length
* @return 產(chǎn)生的隨機(jī)字符串
*/
function
getNonceStr($length = 32)
{
$chars =
"abcdefghijklmnopqrstuvwxyz0123456789"
;
$str =
""
;
for
( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return
$str;
}
/**
* 輸出xml字符
**/
function
ToXml($datas)
{
$xml =
"<xml>"
;
foreach ($datas as $key=>$val)
{
if
(is_numeric($val)){
$xml.=
"<"
.$key.
">"
.$val.
"</"
.$key.
">"
;
}
else
{
$xml.=
"<"
.$key.
"><![CDATA["
.$val.
"]]></"
.$key.
">"
;
}
}
$xml.=
"</xml>"
;
return
$xml;
}
/**
* 格式化參數(shù)格式化成url參數(shù)
*/
function
ToUrlParamss($datas)
{
$buff =
""
;
foreach ($datas as $k => $v)
{
if
($k !=
"sign"
&& $v !=
""
&& !is_array($v)){
$buff .= $k .
"="
. $v .
"&"
;
}
}
$buff = trim($buff,
"&"
);
return
$buff;
}
/**
* 以post方式提交xml到對(duì)應(yīng)的接口url
*
* @param string $xml 需要post的xml數(shù)據(jù)
* @param string $url url
* @param bool $useCert 是否需要證書,默認(rèn)不需要
* @param int $second url執(zhí)行超時(shí)時(shí)間,默認(rèn)30s
*/
function
postXmlCurl($xml, $url, $useCert =
false
, $second = 30)
{
$ch = curl_init();
//設(shè)置超時(shí)
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,
false
);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,
false
);
//嚴(yán)格校驗(yàn)
//設(shè)置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求結(jié)果為字符串且輸出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//運(yùn)行curl
$data = curl_exec($ch);
//返回結(jié)果
curl_close($ch);
return
$data;
}
/**
* 將xml轉(zhuǎn)為array
* @param string $xml
*/
function
FromXml($xml)
{
if
(!$xml){
echo
"xml數(shù)據(jù)異常!"
;
}
//將XML轉(zhuǎn)為array
//禁止引用外部xml實(shí)體
libxml_disable_entity_loader(
true
);
$data = json_decode(json_encode(simplexml_load_string($xml,
'SimpleXMLElement'
, LIBXML_NOCDATA)),
true
);
return
$data;
}
/**
* 獲取jsapi支付的參數(shù)
* @param array $UnifiedOrderResult 統(tǒng)一支付接口返回的數(shù)據(jù)
* @return json數(shù)據(jù),可直接填入js函數(shù)作為參數(shù)
*/
function
GetJsApiParameters(){
$UnifiedOrderResult = unifiedOrder();
if
(!array_key_exists(
"appid"
, $UnifiedOrderResult)
|| !array_key_exists(
"prepay_id"
, $UnifiedOrderResult)
|| $UnifiedOrderResult[
'prepay_id'
] ==
""
)
{
echo $UnifiedOrderResult[
'err_code_des'
];
exit;
}
$da = array();
$da[
'appId'
] = $UnifiedOrderResult[
"appid"
];
$timeStamp = time();
$da[
'timeStamp'
] =
"$timeStamp"
;
$da[
'nonceStr'
] = getNonceStr();
$da[
'package'
] =
"prepay_id="
. $UnifiedOrderResult[
'prepay_id'
];
$da[
'signType'
] =
'MD5'
;
//簽名步驟一:按字典序排序參數(shù)
ksort($da);
$string = ToUrlParamss($da);
//簽名步驟二:在string后加入KEY
$string = $string .
"&key="
.KEY;
//簽名步驟三:MD5加密
$string = md5($string);
//簽名步驟四:所有字符轉(zhuǎn)為大寫
$result = strtoupper($string);
$da[
'paySign'
] = $result;
$parameters = json_encode($da);
return
$parameters;
}
$da = GetJsApiParameters();
var_dump($da);
?>
<html>
<head>
<meta http-equiv=
"content-type"
content=
"text/html;charset=utf-8"
/>
<meta name=
"viewport"
content=
"width=device-width, initial-scale=1"
/>
<title>微信h5支付-王文曉</title>
<script type=
"text/javascript"
>
//調(diào)用微信JS api 支付
function
jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest'
,
<?php echo $da; ?>,
function
(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg);
}
);
}
function
callpay()
{
if
(
typeof
WeixinJSBridge ==
"undefined"
){
if
( document.addEventListener ){
document.addEventListener(
'WeixinJSBridgeReady'
, jsApiCall,
false
);
}
else
if
(document.attachEvent){
document.attachEvent(
'WeixinJSBridgeReady'
, jsApiCall);
document.attachEvent(
'onWeixinJSBridgeReady'
, jsApiCall);
}
}
else
{
jsApiCall();
}
}
</script>
</head>
<body>
<br/>
<font color=
"#9ACD32"
><b>該筆訂單支付金額為<span style=
"color:#f00;font-size:50px"
>1分</span>錢</b></font><br/><br/>
<div align=
"center"
>
<button style=
"width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;"
type=
"button"
onclick=
"callpay()"
>立即支付</button>
</div>
</body>
</html>
聯(lián)系客服