ZLW-PC\Administrator
7 years ago
18 changed files with 2805 additions and 19 deletions
-
1app/Http/Controllers/Api/UserController.php
-
36app/Http/Controllers/Weixin/UserController.php
-
1app/Http/Kernel.php
-
24app/Http/Middleware/WxLogin.php
-
10public/css/weixin/style.css
-
1277public/js/jquery-form.js
-
10resources/org/wxpay/SDKRuntimeException.class.php
-
959resources/org/wxpay/WxPayPubHelper.class.php
-
26resources/org/wxpay/cert/apiclient_cert.pem
-
28resources/org/wxpay/cert/apiclient_key.pem
-
144resources/org/wxpay/demo.php
-
50resources/org/wxpay/wxt.html
-
0resources/org/wxpay/说明.txt
-
15resources/views/weixin/user/index.blade.php
-
99resources/views/weixin/user/login.blade.php
-
4resources/views/weixin/user/userAccount.blade.php
-
121resources/views/weixin/user/userinfo.blade.php
-
19routes/web.php
@ -0,0 +1,24 @@ |
|||
<?php |
|||
namespace App\Http\Middleware; |
|||
|
|||
use Closure; |
|||
|
|||
class WxLogin |
|||
{ |
|||
/** |
|||
* 微信端登录验证 |
|||
*/ |
|||
public function handle($request, Closure $next) |
|||
{ |
|||
if(isset($_SESSION['weixin_user_info'])) |
|||
{ |
|||
|
|||
} |
|||
else |
|||
{ |
|||
header('Location: '.route('weixin'));exit; |
|||
} |
|||
|
|||
return $next($request); |
|||
} |
|||
} |
1277
public/js/jquery-form.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,10 @@ |
|||
<?php |
|||
class SDKRuntimeException extends Exception |
|||
{ |
|||
public function errorMessage() |
|||
{ |
|||
return $this->getMessage(); |
|||
} |
|||
|
|||
} |
|||
?>
|
@ -0,0 +1,959 @@ |
|||
<?php |
|||
/** |
|||
* 微信支付帮助库 |
|||
* ==================================================== |
|||
* 接口分三种类型: |
|||
* 【请求型接口】--Wxpay_client_ |
|||
* 统一支付接口类--UnifiedOrder |
|||
* 订单查询接口--OrderQuery |
|||
* 退款申请接口--Refund |
|||
* 退款查询接口--RefundQuery |
|||
* 对账单接口--DownloadBill |
|||
* 短链接转换接口--ShortUrl |
|||
* 【响应型接口】--Wxpay_server_ |
|||
* 通用通知接口--Notify |
|||
* Native支付——请求商家获取商品信息接口--NativeCall |
|||
* 【其他】 |
|||
* 静态链接二维码--NativeLink |
|||
* JSAPI支付--JsApi |
|||
* ===================================================== |
|||
* 【CommonUtil】常用工具: |
|||
* trimString(),设置参数时需要用到的字符处理函数 |
|||
* createNoncestr(),产生随机字符串,不长于32位 |
|||
* formatBizQueryParaMap(),格式化参数,签名过程需要用到 |
|||
* getSign(),生成签名 |
|||
* arrayToXml(),array转xml |
|||
* xmlToArray(),xml转 array |
|||
* postXmlCurl(),以post方式提交xml到对应的接口url |
|||
* postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url |
|||
*/ |
|||
|
|||
include_once("SDKRuntimeException.class.php"); |
|||
|
|||
/** |
|||
* 所有接口的基类 |
|||
*/ |
|||
class Common_util_pub |
|||
{ |
|||
public $wxconfig; |
|||
|
|||
public function __construct($wxconfig) |
|||
{ |
|||
$this->wxconfig=$wxconfig; |
|||
} |
|||
|
|||
function trimString($value) |
|||
{ |
|||
$ret = null; |
|||
|
|||
if (null != $value) |
|||
{ |
|||
$ret = $value; |
|||
|
|||
if (strlen($ret) == 0) |
|||
{ |
|||
$ret = null; |
|||
} |
|||
} |
|||
|
|||
return $ret; |
|||
} |
|||
|
|||
/** |
|||
* 作用:产生随机字符串,不长于32位 |
|||
*/ |
|||
public function createNoncestr( $length = 32 ) |
|||
{ |
|||
$chars = "abcdefghijklmnopqrstuvwxyz0123456789"; |
|||
$str =""; |
|||
|
|||
for ( $i = 0; $i < $length; $i++ ) |
|||
{ |
|||
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); |
|||
} |
|||
|
|||
return $str; |
|||
} |
|||
|
|||
/** |
|||
* 作用:格式化参数,签名过程需要使用 |
|||
*/ |
|||
function formatBizQueryParaMap($paraMap, $urlencode) |
|||
{ |
|||
$buff = ""; |
|||
ksort($paraMap); |
|||
|
|||
foreach ($paraMap as $k => $v) |
|||
{ |
|||
if($urlencode) |
|||
{ |
|||
$v = urlencode($v); |
|||
} |
|||
//$buff .= strtolower($k) . "=" . $v . "&";
|
|||
$buff .= $k . "=" . $v . "&"; |
|||
} |
|||
|
|||
$reqPar = ""; |
|||
|
|||
if (strlen($buff) > 0) |
|||
{ |
|||
$reqPar = substr($buff, 0, strlen($buff)-1); |
|||
} |
|||
|
|||
return $reqPar; |
|||
} |
|||
|
|||
/** |
|||
* 作用:生成签名 |
|||
*/ |
|||
public function getSign($Obj) |
|||
{ |
|||
foreach ($Obj as $k => $v) |
|||
{ |
|||
$Parameters[$k] = $v; |
|||
} |
|||
//签名步骤一:按字典序排序参数
|
|||
ksort($Parameters); |
|||
$String = $this->formatBizQueryParaMap($Parameters, false); |
|||
//echo '【string1】'.$String.'</br>';
|
|||
//签名步骤二:在string后加入KEY
|
|||
$String = $String."&key=".$this->wxconfig['KEY']; |
|||
//echo "【string2】".$String."</br>";
|
|||
//签名步骤三:MD5加密
|
|||
$String = md5($String); |
|||
//echo "【string3】 ".$String."</br>";
|
|||
//签名步骤四:所有字符转为大写
|
|||
$result_ = strtoupper($String); |
|||
//echo "【result】 ".$result_."</br>";
|
|||
return $result_; |
|||
} |
|||
|
|||
/** |
|||
* 作用:array转xml |
|||
*/ |
|||
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; |
|||
} |
|||
|
|||
/** |
|||
* 作用:将xml转为array |
|||
*/ |
|||
public function xmlToArray($xml) |
|||
{ |
|||
//将XML转为array
|
|||
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); |
|||
return $array_data; |
|||
} |
|||
|
|||
/** |
|||
* 作用:以post方式提交xml到对应的接口url |
|||
*/ |
|||
public function postXmlCurl($xml,$url,$second=30) |
|||
{ |
|||
//初始化curl
|
|||
$ch = curl_init(); |
|||
//设置超时
|
|||
curl_setopt($ch, CURLOP_TIMEOUT, $second); |
|||
//这里设置代理,如果有的话
|
|||
//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); |
|||
//设置header
|
|||
curl_setopt($ch, CURLOPT_HEADER, FALSE); |
|||
//要求结果为字符串且输出到屏幕上
|
|||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); |
|||
//post提交方式
|
|||
curl_setopt($ch, CURLOPT_POST, TRUE); |
|||
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); |
|||
//运行curl
|
|||
$data = curl_exec($ch); |
|||
curl_close($ch); |
|||
//返回结果
|
|||
if($data) |
|||
{ |
|||
curl_close($ch); |
|||
return $data; |
|||
} |
|||
else |
|||
{ |
|||
$error = curl_errno($ch); |
|||
echo "curl出错,错误码:$error"."<br>"; |
|||
echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>"; |
|||
curl_close($ch); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 作用:使用证书,以post方式提交xml到对应的接口url |
|||
*/ |
|||
function postXmlSSLCurl($xml,$url,$second=30) |
|||
{ |
|||
$ch = curl_init(); |
|||
//超时时间
|
|||
curl_setopt($ch,CURLOPT_TIMEOUT,$second); |
|||
//这里设置代理,如果有的话
|
|||
//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); |
|||
//设置header
|
|||
curl_setopt($ch,CURLOPT_HEADER,FALSE); |
|||
//要求结果为字符串且输出到屏幕上
|
|||
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); |
|||
//设置证书
|
|||
//使用证书:cert 与 key 分别属于两个.pem文件
|
|||
//默认格式为PEM,可以注释
|
|||
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); |
|||
curl_setopt($ch,CURLOPT_SSLCERT, $this->wxconfig['SSLCERT_PATH']); |
|||
//默认格式为PEM,可以注释
|
|||
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); |
|||
curl_setopt($ch,CURLOPT_SSLKEY, $this->wxconfig['SSLKEY_PATH']); |
|||
//post提交方式
|
|||
curl_setopt($ch,CURLOPT_POST, true); |
|||
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); |
|||
$data = curl_exec($ch); |
|||
//返回结果
|
|||
if($data){ |
|||
curl_close($ch); |
|||
return $data; |
|||
} |
|||
else { |
|||
$error = curl_errno($ch); |
|||
echo "curl出错,错误码:$error"."<br>"; |
|||
echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>"; |
|||
curl_close($ch); |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 作用:打印数组 |
|||
*/ |
|||
function printErr($wording='',$err='') |
|||
{ |
|||
print_r('<pre>'); |
|||
echo $wording."</br>"; |
|||
var_dump($err); |
|||
print_r('</pre>'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 请求型接口的基类 |
|||
*/ |
|||
class Wxpay_client_pub extends Common_util_pub |
|||
{ |
|||
var $parameters;//请求参数,类型为关联数组
|
|||
public $response;//微信返回的响应
|
|||
public $result;//返回参数,类型为关联数组
|
|||
var $url;//接口链接
|
|||
var $curl_timeout;//curl超时时间
|
|||
|
|||
/** |
|||
* 作用:设置请求参数 |
|||
*/ |
|||
function setParameter($parameter, $parameterValue) |
|||
{ |
|||
$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); |
|||
} |
|||
|
|||
/** |
|||
* 作用:设置标配的请求参数,生成签名,生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
return $this->arrayToXml($this->parameters); |
|||
} |
|||
|
|||
/** |
|||
* 作用:post请求xml |
|||
*/ |
|||
function postXml() |
|||
{ |
|||
$xml = $this->createXml(); |
|||
$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout); |
|||
return $this->response; |
|||
} |
|||
|
|||
/** |
|||
* 作用:使用证书post请求xml |
|||
*/ |
|||
function postXmlSSL() |
|||
{ |
|||
$xml = $this->createXml(); |
|||
$this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout); |
|||
return $this->response; |
|||
} |
|||
|
|||
/** |
|||
* 作用:获取结果,默认不使用证书 |
|||
*/ |
|||
function getResult() |
|||
{ |
|||
$this->postXml(); |
|||
$this->result = $this->xmlToArray($this->response); |
|||
return $this->result; |
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 统一支付接口类 |
|||
*/ |
|||
class UnifiedOrder_pub extends Wxpay_client_pub |
|||
{ |
|||
function __construct($appconfig) |
|||
{ |
|||
Common_util_pub::__construct($appconfig); |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
try |
|||
{ |
|||
//检测必填参数
|
|||
if($this->parameters["out_trade_no"] == null) |
|||
{ |
|||
throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."<br>"); |
|||
}elseif($this->parameters["body"] == null){ |
|||
throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."<br>"); |
|||
}elseif ($this->parameters["total_fee"] == null ) { |
|||
throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."<br>"); |
|||
}elseif ($this->parameters["notify_url"] == null) { |
|||
throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."<br>"); |
|||
}elseif ($this->parameters["trade_type"] == null) { |
|||
throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."<br>"); |
|||
}elseif ($this->parameters["trade_type"] == "JSAPI" && |
|||
$this->parameters["openid"] == NULL){ |
|||
throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['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); |
|||
} |
|||
catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取prepay_id |
|||
*/ |
|||
function getPrepayId() |
|||
{ |
|||
$this->postXml(); |
|||
$this->result = $this->xmlToArray($this->response); |
|||
$prepay_id = $this->result["prepay_id"]; |
|||
|
|||
return $prepay_id; |
|||
} |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 订单查询接口 |
|||
*/ |
|||
class OrderQuery_pub extends Wxpay_client_pub |
|||
{ |
|||
function __construct() |
|||
{ |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/pay/orderquery"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
try |
|||
{ |
|||
//检测必填参数
|
|||
if($this->parameters["out_trade_no"] == null && |
|||
$this->parameters["transaction_id"] == null) |
|||
{ |
|||
throw new SDKRuntimeException("订单查询接口中,out_trade_no、transaction_id至少填一个!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
return $this->arrayToXml($this->parameters); |
|||
}catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 退款申请接口 |
|||
*/ |
|||
class Refund_pub extends Wxpay_client_pub |
|||
{ |
|||
|
|||
function __construct() |
|||
{ |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
try |
|||
{ |
|||
//检测必填参数
|
|||
if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) { |
|||
throw new SDKRuntimeException("退款申请接口中,out_trade_no、transaction_id至少填一个!"."<br>"); |
|||
}elseif($this->parameters["out_refund_no"] == null){ |
|||
throw new SDKRuntimeException("退款申请接口中,缺少必填参数out_refund_no!"."<br>"); |
|||
}elseif($this->parameters["total_fee"] == null){ |
|||
throw new SDKRuntimeException("退款申请接口中,缺少必填参数total_fee!"."<br>"); |
|||
}elseif($this->parameters["refund_fee"] == null){ |
|||
throw new SDKRuntimeException("退款申请接口中,缺少必填参数refund_fee!"."<br>"); |
|||
}elseif($this->parameters["op_user_id"] == null){ |
|||
throw new SDKRuntimeException("退款申请接口中,缺少必填参数op_user_id!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
return $this->arrayToXml($this->parameters); |
|||
}catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 作用:获取结果,使用证书通信 |
|||
*/ |
|||
function getResult() |
|||
{ |
|||
$this->postXmlSSL(); |
|||
$this->result = $this->xmlToArray($this->response); |
|||
return $this->result; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 退款查询接口 |
|||
*/ |
|||
class RefundQuery_pub extends Wxpay_client_pub |
|||
{ |
|||
function __construct() |
|||
{ |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/pay/refundquery"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
try |
|||
{ |
|||
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("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
return $this->arrayToXml($this->parameters); |
|||
} |
|||
catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 作用:获取结果,使用证书通信 |
|||
*/ |
|||
function getResult() |
|||
{ |
|||
$this->postXmlSSL(); |
|||
$this->result = $this->xmlToArray($this->response); |
|||
return $this->result; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 对账单接口 |
|||
*/ |
|||
class DownloadBill_pub extends Wxpay_client_pub |
|||
{ |
|||
function __construct() |
|||
{ |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/pay/downloadbill"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
try |
|||
{ |
|||
if($this->parameters["bill_date"] == null ) |
|||
{ |
|||
throw new SDKRuntimeException("对账单接口中,缺少必填参数bill_date!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
return $this->arrayToXml($this->parameters); |
|||
} |
|||
catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 作用:获取结果,默认不使用证书 |
|||
*/ |
|||
function getResult() |
|||
{ |
|||
$this->postXml(); |
|||
$this->result = $this->xmlToArray($this->result_xml); |
|||
return $this->result; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 短链接转换接口 |
|||
*/ |
|||
class ShortUrl_pub extends Wxpay_client_pub |
|||
{ |
|||
function __construct() |
|||
{ |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/tools/shorturl"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
try |
|||
{ |
|||
if($this->parameters["long_url"] == null ) |
|||
{ |
|||
throw new SDKRuntimeException("短链接转换接口中,缺少必填参数long_url!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
return $this->arrayToXml($this->parameters); |
|||
}catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取prepay_id |
|||
*/ |
|||
function getShortUrl() |
|||
{ |
|||
$this->postXml(); |
|||
$prepay_id = $this->result["short_url"]; |
|||
return $prepay_id; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 响应型接口基类 |
|||
*/ |
|||
class Wxpay_server_pub extends Common_util_pub |
|||
{ |
|||
public $data;//接收到的数据,类型为关联数组
|
|||
var $returnParameters;//返回参数,类型为关联数组
|
|||
|
|||
/** |
|||
* 将微信的请求xml转换成关联数组,以方便数据处理 |
|||
*/ |
|||
function saveData($xml) |
|||
{ |
|||
$this->data = $this->xmlToArray($xml); |
|||
} |
|||
|
|||
function checkSign() |
|||
{ |
|||
$tmpData = $this->data; |
|||
unset($tmpData['sign']); |
|||
$sign = $this->getSign($tmpData);//本地签名
|
|||
if ($this->data['sign'] == $sign) { |
|||
return TRUE; |
|||
} |
|||
return FALSE; |
|||
} |
|||
|
|||
/** |
|||
* 获取微信的请求数据 |
|||
*/ |
|||
function getData() |
|||
{ |
|||
return $this->data; |
|||
} |
|||
|
|||
/** |
|||
* 设置返回微信的xml数据 |
|||
*/ |
|||
function setReturnParameter($parameter, $parameterValue) |
|||
{ |
|||
$this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue); |
|||
} |
|||
|
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
return $this->arrayToXml($this->returnParameters); |
|||
} |
|||
|
|||
/** |
|||
* 将xml数据返回微信 |
|||
*/ |
|||
function returnXml() |
|||
{ |
|||
$returnXml = $this->createXml(); |
|||
return $returnXml; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 通用通知接口 |
|||
*/ |
|||
class Notify_pub extends Wxpay_server_pub |
|||
{ |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 请求商家获取商品信息接口 |
|||
*/ |
|||
class NativeCall_pub extends Wxpay_server_pub |
|||
{ |
|||
/** |
|||
* 生成接口参数xml |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
if($this->returnParameters["return_code"] == "SUCCESS"){ |
|||
$this->returnParameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->returnParameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->returnParameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->returnParameters["sign"] = $this->getSign($this->returnParameters);//签名
|
|||
} |
|||
return $this->arrayToXml($this->returnParameters); |
|||
} |
|||
|
|||
/** |
|||
* 获取product_id |
|||
*/ |
|||
function getProductId() |
|||
{ |
|||
$product_id = $this->data["product_id"]; |
|||
return $product_id; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 静态链接二维码 |
|||
*/ |
|||
class NativeLink_pub extends Common_util_pub |
|||
{ |
|||
var $parameters;//静态链接参数
|
|||
var $url;//静态链接
|
|||
|
|||
function __construct() |
|||
{ |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 设置参数 |
|||
*/ |
|||
function setParameter($parameter, $parameterValue) |
|||
{ |
|||
$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); |
|||
} |
|||
|
|||
/** |
|||
* 生成Native支付链接二维码 |
|||
*/ |
|||
function createLink() |
|||
{ |
|||
try |
|||
{ |
|||
if($this->parameters["product_id"] == null) |
|||
{ |
|||
throw new SDKRuntimeException("缺少Native支付二维码链接必填参数product_id!"."<br>"); |
|||
} |
|||
$this->parameters["appid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$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; |
|||
}catch (SDKRuntimeException $e) |
|||
{ |
|||
die($e->errorMessage()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 返回链接 |
|||
*/ |
|||
function getUrl() |
|||
{ |
|||
$this->createLink(); |
|||
return $this->url; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* JSAPI支付——H5网页端调起支付接口 |
|||
*/ |
|||
class JsApi_pub extends Common_util_pub |
|||
{ |
|||
var $code;//code码,用以获取openid
|
|||
var $openid;//用户的openid
|
|||
var $parameters;//jsapi参数,格式为json
|
|||
var $prepay_id;//使用统一支付接口得到的预支付id
|
|||
var $curl_timeout;//curl超时时间
|
|||
|
|||
function __construct($appconfig) |
|||
{ |
|||
Common_util_pub::__construct($appconfig); |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 作用:生成可以获得code的url |
|||
*/ |
|||
function createOauthUrlForCode($redirectUrl) |
|||
{ |
|||
$urlObj["appid"] = $this->wxconfig['APPID']; |
|||
$urlObj["redirect_uri"] = "$redirectUrl"; |
|||
$urlObj["response_type"] = "code"; |
|||
$urlObj["scope"] = "snsapi_base"; |
|||
$urlObj["state"] = "STATE"."#wechat_redirect"; |
|||
$bizString = $this->formatBizQueryParaMap($urlObj, false); |
|||
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; |
|||
} |
|||
|
|||
/** |
|||
* 作用:生成可以获得openid的url |
|||
*/ |
|||
function createOauthUrlForOpenid() |
|||
{ |
|||
$urlObj["appid"] = $this->wxconfig['APPID']; |
|||
$urlObj["secret"] = $this->wxconfig['APPSECRET']; |
|||
$urlObj["code"] = $this->code; |
|||
$urlObj["grant_type"] = "authorization_code"; |
|||
$bizString = $this->formatBizQueryParaMap($urlObj, false); |
|||
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; |
|||
} |
|||
|
|||
/** |
|||
* 作用:通过curl向微信提交code,以获取openid |
|||
*/ |
|||
function 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"] = $this->wxconfig['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; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 发送红包 |
|||
*/ |
|||
class Sendredpack extends Common_util_pub |
|||
{ |
|||
function __construct($appconfig) |
|||
{ |
|||
Common_util_pub::__construct($appconfig); |
|||
//设置接口链接
|
|||
$this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; |
|||
//设置curl超时时间
|
|||
$this->curl_timeout = $this->wxconfig['CURL_TIMEOUT']; |
|||
} |
|||
|
|||
/** |
|||
* 作用:设置请求参数 |
|||
*/ |
|||
function setParameter($parameter, $parameterValue) |
|||
{ |
|||
$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); |
|||
} |
|||
|
|||
function check_sign_parameters() |
|||
{ |
|||
if($this->parameters["nonce_str"] == null || |
|||
$this->parameters["mch_billno"] == null || |
|||
$this->parameters["mch_id"] == null || |
|||
$this->parameters["wxappid"] == null || |
|||
$this->parameters["send_name"] == null || |
|||
$this->parameters["re_openid"] == null || |
|||
$this->parameters["total_amount"] == null || |
|||
$this->parameters["total_num"] == null || |
|||
$this->parameters["wishing"] == null || |
|||
$this->parameters["client_ip"] == null || |
|||
$this->parameters["act_name"] == null || |
|||
$this->parameters["remark"] == null |
|||
) |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
//生成红包接口XML信息
|
|||
/* |
|||
<xml> |
|||
<sign>![CDATA[E1EE61A9]]</sign> |
|||
<mch_billno>![CDATA[00100]]</mch_billno> |
|||
<mch_id>![CDATA[888]]</mch_id> |
|||
<wxappid>![CDATA[wxcbda96de0b165486]]</wxappid> |
|||
<send_name>![CDATA[send_name]]</send_name> |
|||
<re_openid>![CDATA[onqOjjXXXXXXXXX]]</re_openid> |
|||
<total_amount>![CDATA[100]]</total_amount> |
|||
<total_num>![CDATA[1]]</total_num> |
|||
<wishing>![CDATA[恭喜发财]]</wishing> |
|||
<client_ip>![CDATA[127.0.0.1]]</client_ip> |
|||
<act_name>![CDATA[新年红包]]</act_name> |
|||
<remark>![CDATA[新年红包]]</remark> |
|||
</xml> |
|||
*/ |
|||
function createXml() |
|||
{ |
|||
$this->parameters["wxappid"] = $this->wxconfig['APPID'];//公众账号ID
|
|||
$this->parameters["mch_id"] = $this->wxconfig['MCHID'];//商户号
|
|||
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
|
|||
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
|
|||
|
|||
return $this->arrayToXml($this->parameters); |
|||
} |
|||
|
|||
/** |
|||
* 作用:使用证书post请求xml |
|||
*/ |
|||
function postXmlSSL() |
|||
{ |
|||
$xml = $this->createXml(); |
|||
$this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout); |
|||
return $this->response; |
|||
} |
|||
} |
|||
?>
|
@ -0,0 +1,26 @@ |
|||
-----BEGIN CERTIFICATE----- |
|||
MIIEXzCCA8igAwIBAgIDEN9AMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD |
|||
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE |
|||
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w |
|||
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MDIwMzExNDg1OVoX |
|||
DTI2MDEzMTExNDg1OVowgY8xCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv |
|||
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL |
|||
EwVNTVBheTEkMCIGA1UEAxQb6Ieq5Yqo5YyW5rWL6K+V5ZWG5oi35ZCN56ewMREw |
|||
DwYDVQQEEwgxMTM4NDEzMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB |
|||
ALQ/qiPEwzmDLkWQhwA1Td6YQh1BxhgxH244rdpyfiiXv/m/QbYGfkJ27EZiNOkR |
|||
tZg0kOh4XGfo99bQwia+SSxPsajtnTwbGOYPKRP4Xc44SlFR9n9v3N5XzLJSXZrv |
|||
lKnz3Cf7PdHRTXxs0w0gsubMTu2P0MACLfUw11IPtGisx+SGMlgjGZ20q6suYF+R |
|||
ydUTXvHelo9R/HFfyV3RPSZryOHP1CtKMh+H1DOwdwF+d/ZIY2nkdS9HBe3Q2QD1 |
|||
/Po6z1hD6LAnAdggGOyXjLNsSgkQwizQdf5Xc6xxIgLfEZlzHOM5ndLbLPovm+yP |
|||
cilvm1qu7AeKs/qodj5FU9cCAwEAAaOCAUYwggFCMAkGA1UdEwQCMAAwLAYJYIZI |
|||
AYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNhdGUiMB0GA1UdDgQW |
|||
BBSRQB0ev//y8tmCeOhM6YdhH88DGzCBvwYDVR0jBIG3MIG0gBQ+BSb2ImK0FVuI |
|||
zWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1YW5n |
|||
ZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1RlbmNlbnQxDDAKBgNV |
|||
BAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqGSIb3DQEJARYQbW1w |
|||
YXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQEAwIGwDAWBgNVHSUB |
|||
Af8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQADwihpkyMaJTaSII48 |
|||
fFz2QbuR14op8CDqYBfF1VKRUahqFWsNEJJ+3KgRLkphwfVWSa7z1Q9EiBCGpKTI |
|||
ug7ER/ZPJUVRXZHbIkveGGV5PmBjAD544McjXHO8PGJ3AubD/iXFwYtHmLDwME8W |
|||
5nBNnaKkV4+uSPzg8UrBWbCfEw== |
|||
-----END CERTIFICATE----- |
@ -0,0 +1,28 @@ |
|||
-----BEGIN PRIVATE KEY----- |
|||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC0P6ojxMM5gy5F |
|||
kIcANU3emEIdQcYYMR9uOK3acn4ol7/5v0G2Bn5CduxGYjTpEbWYNJDoeFxn6PfW |
|||
0MImvkksT7Go7Z08GxjmDykT+F3OOEpRUfZ/b9zeV8yyUl2a75Sp89wn+z3R0U18 |
|||
bNMNILLmzE7tj9DAAi31MNdSD7RorMfkhjJYIxmdtKurLmBfkcnVE17x3paPUfxx |
|||
X8ld0T0ma8jhz9QrSjIfh9QzsHcBfnf2SGNp5HUvRwXt0NkA9fz6Os9YQ+iwJwHY |
|||
IBjsl4yzbEoJEMIs0HX+V3OscSIC3xGZcxzjOZ3S2yz6L5vsj3Ipb5taruwHirP6 |
|||
qHY+RVPXAgMBAAECggEAb+iLCLQUBTQV2WjW+GEf3JCpk6KPi9uLyRH1loe5HhjB |
|||
PxzofkvfvgI5xaUZdo7hMQOJ6Fs5++WfYkawE//WTGWaRuhn07Z7KfLFrTlpfCxk |
|||
r8J0iUB5X64hT6FlrlkK8s2NpWEOS6NoOVUTX7YqfLLiWgoNL/jqca2GMdPATa/V |
|||
mZj/irYVBmkFbh7gUWWw7cYUwDJsc5jZkEB/wWwOHG8MzyMoOMttuX2Xt+5t36t7 |
|||
mon5a4u7zM7ctrRbONu3oXxmfqfhgvwgKKrcHOptjT3iF0DOoopGlkimRnVd672h |
|||
5CRzaBuV+71CrAYB0vE6WhhUQwnUylYUvFLqzR1EgQKBgQDYDkzPPNG6lJMto/4N |
|||
GH3wtbI5Kad83eymQfeUQrtd8UUA7cYNWEXHZVWs+/fTu93DAIjOESoyWqpcyw4P |
|||
P31CRT7I3fc6PIhEtnvscpK0ln+cq71QIX8Mcie5W3BuoIcTjvsPY3zM9pSZB9Re |
|||
LkO9PY7MMRk9GMcsG+lSXN1clwKBgQDVkqX5M5scWpnO3kj0So6GyZScG2IWQ44C |
|||
0guTZh7dlmzhfwBmXh77sXYNFdIu2eGkGsPBRxqQl3QDdG6bSm2YqwF5VlplabnC |
|||
q1oxHwt90u0L2441wXLWwquhrxvdlnQrJz0IqD476q6WqBeRxLGpIpkztOSwOK26 |
|||
1GlkCtRqwQKBgBjKi0W8VNRz9+9kweH+zXSxZKHqha1uSZlKOH5qqdU9ug1BO1iM |
|||
qHUYy5vtzaIeDHQzu37puU3N2X6MTjCxuE3CZFHoJlYoW/qGdfHLs8nE+x+fFTn8 |
|||
nfdvod9C/sOy58z2uxgo8kkSgjqNC3FDHcK5LYmAmMTJ8xC8oykwPrZBAoGAO4nc |
|||
VzJ5xVfElRUGxYObZBwCH9rKZ2aBymt/6qGHbUKoK9zZ4a/Pd18rh85Tf9ghvTvw |
|||
4orN7w0pvGTTCNug3fSePpNCNA9bR9e5FwSOkY8hojKc3IOHXjN64WINpKJy1Czm |
|||
KOmuH8n2ze0iVPK+jGYmy3FcZ3wFgpYAo3EZcoECgYBWlBWUK3CtT12uoRdepNWg |
|||
DCPm0k7KDW71NqiXkA+jxGxsCcv4M3CuN2Xs//2dTWqErhWqMq7ASmfxumCmPHWs |
|||
dmjya/fGc6G3IrZNj6/fxPrOLShHDBS1HP/9MmVTBd0d39CaSKBaMzvU3DaJu0rq |
|||
d0IqLGwMv/t411orp77J1Q== |
|||
-----END PRIVATE KEY----- |
@ -0,0 +1,144 @@ |
|||
<?php |
|||
//微信支付设置
|
|||
public function wxconf() |
|||
{ |
|||
//=======【基本信息设置】=====================================
|
|||
//微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
|
|||
$wxconfig['APPID'] = 'wx1c7946b5734199d0'; |
|||
//受理商ID,身份标识
|
|||
$wxconfig['MCHID'] = '1331184301'; |
|||
//商户支付密钥Key。审核通过后,在微信发送的邮件中查看
|
|||
$wxconfig['KEY'] = '93aa64d6552bf09401af7e7e6f9b3be7'; |
|||
//JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
|
|||
$wxconfig['APPSECRET'] = '93aa64d6552bf09401af7e7e6f9b3be7'; |
|||
|
|||
//=======【JSAPI路径设置】===================================
|
|||
//获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
|
|||
$wxconfig['JS_API_CALL_URL'] = 'http://'.$_SERVER['HTTP_HOST'].U('Wxpay/index'); |
|||
|
|||
//=======【证书路径设置】=====================================
|
|||
//证书路径,注意应该填写绝对路径
|
|||
$wxconfig['SSLCERT_PATH'] = './cert/apiclient_cert.pem'; |
|||
$wxconfig['SSLKEY_PATH'] = './cert/apiclient_key.pem'; |
|||
|
|||
//=======【异步通知url设置】===================================
|
|||
//异步通知url,商户根据实际开发过程设定
|
|||
$wxconfig['NOTIFY_URL'] = 'http://'.$_SERVER['HTTP_HOST'].U('Wxpay/notify_url'); |
|||
|
|||
//=======【curl超时设置】===================================
|
|||
//本例程通过curl使用HTTP POST方法,此处可修改其超时时间,默认为30秒
|
|||
$wxconfig['CURL_TIMEOUT'] = 30; |
|||
|
|||
return $wxconfig; |
|||
} |
|||
|
|||
//PHP服务端SDK生成APP支付订单信息示例
|
|||
public function wxt() |
|||
{ |
|||
$body = '商品购买';//订单详情
|
|||
$out_trade_no = '2017787878';//订单号
|
|||
$total_fee = floatval(0.01*100);//价格3880.00
|
|||
$wxconfig=$this->wxconf(); |
|||
//=========步骤1:网页授权获取用户openid============
|
|||
//使用jsapi接口
|
|||
require_once './WxPayPubHelper.class.php'; |
|||
//import("@.ORG.Wxpay.WxPayPubHelper");
|
|||
//Vendor('Wxpay.WxPayPubHelper');// 导入微信类
|
|||
$jsApi = new JsApi_pub($wxconfig); |
|||
//通过code获得openid
|
|||
if (!isset($_GET['code'])) |
|||
{ |
|||
//触发微信返回code码
|
|||
//$url = $jsApi->createOauthUrlForCode($this->wxconfig['JS_API_CALL_URL']);
|
|||
$reurl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; |
|||
$url = $jsApi->createOauthUrlForCode(urlencode($reurl)); |
|||
Header("Location: $url"); exit; |
|||
} |
|||
else |
|||
{ |
|||
//获取code码,以获取openid
|
|||
$code = $_GET['code']; |
|||
$jsApi->setCode($code); |
|||
$openid = $jsApi->getOpenId(); |
|||
} |
|||
//=========步骤2:使用统一支付接口,获取prepay_id============
|
|||
//使用统一支付接口
|
|||
$unifiedOrder = new UnifiedOrder_pub($wxconfig); |
|||
|
|||
$notify_url = $wxconfig['NOTIFY_URL'];//通知地址
|
|||
//设置统一支付接口参数
|
|||
//设置必填参数
|
|||
//appid已填,商户无需重复填写
|
|||
//mch_id已填,商户无需重复填写
|
|||
//noncestr已填,商户无需重复填写
|
|||
//spbill_create_ip已填,商户无需重复填写
|
|||
//sign已填,商户无需重复填写
|
|||
$unifiedOrder->setParameter("openid","$openid");//微信用户
|
|||
$unifiedOrder->setParameter("body","$body");//商品描述
|
|||
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
|
|||
$unifiedOrder->setParameter("total_fee","$total_fee");//总金额
|
|||
$unifiedOrder->setParameter("notify_url","$notify_url");//通知地址
|
|||
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
|
|||
//$unifiedOrder->setParameter("attach","test"); //附加数据,选填,在查询API和支付通知中原样返回,可作为自定义参数使用
|
|||
|
|||
$prepay_id = $unifiedOrder->getPrepayId(); |
|||
//=========步骤3:使用jsapi调起支付============
|
|||
$jsApi->setPrepayId($prepay_id); |
|||
$jsApiParameters = $jsApi->getParameters(); |
|||
$this->assign('jsApiParameters',$jsApiParameters); |
|||
|
|||
$returnUrl='http://'.$_SERVER['HTTP_HOST'].U('User/index'); |
|||
$this->assign('returnUrl',$returnUrl); |
|||
$this->display(); |
|||
} |
|||
|
|||
//PHP服务端验证异步通知信息参数示例
|
|||
public function AlipayTradeAppPayNotify() |
|||
{ |
|||
$xml = $GLOBALS['HTTP_RAW_POST_DATA']; |
|||
$post_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); |
|||
$array_data['out_trade_no'] = substr($post_data['out_trade_no'],0,-5); |
|||
$array_data['total_fee'] = $post_data['total_fee']; |
|||
$array_data['trade_state'] = $post_data['result_code']; |
|||
$array_data['transaction_id'] = $post_data['transaction_id']; |
|||
$get_arr = explode('&',$post_data['attach']); |
|||
foreach($get_arr as $value){ |
|||
$tmp_arr = explode('=',$value); |
|||
$array_data[$tmp_arr[0]] = $tmp_arr[1]; |
|||
} |
|||
$wxorder=serialize($array_data);//保存post数据
|
|||
$out_trade_no = $array_data['out_trade_no']; |
|||
|
|||
if($array_data['trade_state']=='SUCCESS' ) |
|||
{ |
|||
echo "SUCCESS"; |
|||
} |
|||
else |
|||
{ |
|||
echo "FAILE"; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 微信红包 |
|||
* @param string $openid 用户openid |
|||
*/ |
|||
public function wxhbpay($re_openid,$money,$wishing='恭喜发财,大吉大利!',$act_name='赠红包活动',$remark='赶快领取您的红包!') |
|||
{ |
|||
import("@.ORG.Wxpay.WxPayPubHelper"); |
|||
$wxHongBaoHelper = new Sendredpack($this->wxconfig); |
|||
$wxHongBaoHelper->setParameter("mch_billno", date('YmdHis').rand(1000, 9999));//订单号
|
|||
$wxHongBaoHelper->setParameter("send_name", '红包');//红包发送者名称
|
|||
$wxHongBaoHelper->setParameter("re_openid", $re_openid);//接受openid
|
|||
$wxHongBaoHelper->setParameter("total_amount", floatval($money*100));//付款金额,单位分
|
|||
$wxHongBaoHelper->setParameter("total_num", 1);//红包収放总人数
|
|||
$wxHongBaoHelper->setParameter("wishing", $wishing);//红包祝福
|
|||
$wxHongBaoHelper->setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址
|
|||
$wxHongBaoHelper->setParameter("act_name", $act_name);//活劢名称
|
|||
$wxHongBaoHelper->setParameter("remark", $remark);//备注信息
|
|||
$responseXml = $wxHongBaoHelper->postXmlSSL(); |
|||
//用作结果调试输出
|
|||
//echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');
|
|||
$responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); |
|||
return $responseObj->result_code; |
|||
} |
@ -0,0 +1,50 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
|||
<meta name="viewport" content="width=device-width,height=device-height,maximum-scale=1.0,user-scalable=no,inital-scale=1.0"> |
|||
<meta name="apple-mobile-web-app-capable" content="yes"> |
|||
<meta name="apple-mobile-web-app-status-bar-style" content="black"> |
|||
<meta name="format-detection" content="telephone=no"> |
|||
<title>微信安全支付</title> |
|||
</head> |
|||
<script> |
|||
//调用微信JS api 支付 |
|||
function jsApiCall() |
|||
{ |
|||
WeixinJSBridge.invoke( |
|||
'getBrandWCPayRequest', |
|||
{$jsApiParameters}, |
|||
function(res){ |
|||
WeixinJSBridge.log(res.err_msg); |
|||
//alert(res.err_code+res.err_desc+res.err_msg); |
|||
|
|||
if(res.err_msg=='get_brand_wcpay_request:ok'){ |
|||
alert('支付成功!'); |
|||
}else{ |
|||
alert('支付失败!'); |
|||
} |
|||
|
|||
setTimeout("location.href = '{$returnUrl}'",2000); |
|||
} |
|||
); |
|||
} |
|||
|
|||
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> |
|||
|
|||
<body onload="callpay();"> |
|||
</body> |
|||
</html> |
@ -0,0 +1,99 @@ |
|||
<!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"/> |
|||
<title>登录</title><meta name="keywords" content="关键词"><meta name="description" content="描述"><meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" name="viewport"> |
|||
<link href="<?php echo env('APP_URL'); ?>/css/weixin/style.css" type="text/css" rel="stylesheet"> |
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/jquery.min.js"></script> |
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/weixin/mobile.js"></script> |
|||
<link href="<?php echo env('APP_URL'); ?>/css/font-awesome.min.css" type="text/css" rel="stylesheet"></head><body> |
|||
<div class="classreturn loginsignup"> |
|||
<div class="ds-in-bl return"><a href="javascript:history.back(-1);"><img src="<?php echo env('APP_URL'); ?>/images/weixin/return.png" alt="返回"></a></div> |
|||
<div class="ds-in-bl tit center"><span>登录</span></div> |
|||
<div class="ds-in-bl nav_menu"><a href="javascript:void(0);"><img src="<?php echo env('APP_URL'); ?>/images/weixin/class1.png" alt="菜单"></a></div> |
|||
</div> |
|||
<div class="flool tpnavf cl"> |
|||
<div class="nav_list"> |
|||
<ul> |
|||
<a href="index.html"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/home_icon.png"><p>首页</p></li></a> |
|||
<a href="/Weixin/index.php?m=Store&a=index"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/brand_icon.png"><p>分类</p></li></a> |
|||
<a href="/Weixin/index.php?m=Cart&a=index"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/car_icon.png"><p>购物车</p></li></a> |
|||
<a href="/Weixin/index.php?m=User&a=index"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/center_icon.png"><p>个人中心</p></li></a></ul> |
|||
<div class="cl"></div> |
|||
</div> |
|||
</div> |
|||
<style> |
|||
.account{text-align:center;margin-top:50px;} |
|||
.account .icon{color:#FFCC00;font-size:100px;}
|
|||
.bottoma{display:block;font-size:18px;padding:10px;border-radius:2px;} |
|||
|
|||
.adr_add{margin:0 10px;} |
|||
.adr-form-group{margin-top:10px;} |
|||
.adr-form-group input[type=text],.adr-form-group input[type=password]{display:block;width:100%;font-size:16px;padding:12px;color:#777;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:0;box-sizing:border-box;}
|
|||
</style> |
|||
<div class="floor account"> |
|||
<div class="icon"><i class="fa fa-user-circle" aria-hidden="true"></i></div> |
|||
<br> |
|||
|
|||
<div class="adr_add"> |
|||
<div class="adr-form-group"> |
|||
<input type="text" name="username" class="" id="username" placeholder="请输入账号"> |
|||
</div> |
|||
<div class="adr-form-group"> |
|||
<input type="password" name="password" class="" id="password" placeholder="请输入密码"> |
|||
</div> |
|||
</div> |
|||
|
|||
<a style="margin:10px;background-color:#1aad19;text-align:center;color:white;border:1px solid #179e16;" class="bottoma" href="javascript:submit();">登录</a> |
|||
</div> |
|||
|
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/layer/mobile/layer.js"></script> |
|||
<script> |
|||
function submit() |
|||
{ |
|||
var username = $("#username").val(); |
|||
var password = $("#password").val(); |
|||
|
|||
if(username == '') |
|||
{ |
|||
//提示
|
|||
layer.open({ |
|||
content: '账号不能为空' |
|||
,skin: 'msg' |
|||
,time: 2 //2秒后自动关闭
|
|||
}); |
|||
|
|||
return false; |
|||
} |
|||
|
|||
if(password == '') |
|||
{ |
|||
//提示
|
|||
layer.open({ |
|||
content: '密码不能为空' |
|||
,skin: 'msg' |
|||
,time: 2 //2秒后自动关闭
|
|||
}); |
|||
|
|||
return false; |
|||
} |
|||
|
|||
$.post(url,{name:name,mobile:mobile,address:address,province:province,city:city,district:district,is_default:is_default},function(res) |
|||
{ |
|||
if(res.code==0) |
|||
{ |
|||
//提示
|
|||
layer.open({ |
|||
content: res.msg |
|||
,skin: 'msg' |
|||
,time: 2 //2秒后自动关闭
|
|||
}); |
|||
|
|||
window.history.back(); |
|||
} |
|||
else |
|||
{ |
|||
|
|||
} |
|||
},'json'); |
|||
} |
|||
</script> |
|||
@include('weixin.common.footer') |
|||
</body></html> |
@ -0,0 +1,121 @@ |
|||
<!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"/> |
|||
<title>编辑资料</title><meta name="keywords" content="关键词"><meta name="description" content="描述"><meta content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" name="viewport"> |
|||
<link href="<?php echo env('APP_URL'); ?>/css/weixin/style.css" type="text/css" rel="stylesheet"> |
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/jquery.min.js"></script> |
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/weixin/mobile.js"></script> |
|||
<link href="<?php echo env('APP_URL'); ?>/css/font-awesome.min.css" type="text/css" rel="stylesheet"></head><body style="background-color:#f1f1f1;"> |
|||
<div class="classreturn loginsignup"> |
|||
<div class="ds-in-bl return"><a href="javascript:history.back(-1);"><img src="<?php echo env('APP_URL'); ?>/images/weixin/return.png" alt="返回"></a></div> |
|||
<div class="ds-in-bl tit center"><span>编辑资料</span></div> |
|||
<div class="ds-in-bl nav_menu"><a href="javascript:void(0);"><img src="<?php echo env('APP_URL'); ?>/images/weixin/class1.png" alt="菜单"></a></div> |
|||
</div> |
|||
<div class="flool tpnavf cl"> |
|||
<div class="nav_list"> |
|||
<ul> |
|||
<a href="<?php echo route('weixin'); ?>"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/home_icon.png"><p>首页</p></li></a> |
|||
<a href="/Weixin/index.php?m=Store&a=index"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/brand_icon.png"><p>分类</p></li></a> |
|||
<a href="/Weixin/index.php?m=Cart&a=index"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/car_icon.png"><p>购物车</p></li></a> |
|||
<a href="/Weixin/index.php?m=User&a=index"><li><img src="<?php echo env('APP_URL'); ?>/images/weixin/center_icon.png"><p>个人中心</p></li></a></ul> |
|||
<div class="cl"></div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="floor"> |
|||
<ul class="fui-list mt10"> |
|||
<li> |
|||
<div class="ui-list-thumb"> |
|||
<!-- <span style="background-image:url(<?php echo env('APP_URL'); ?>/images/weixin/no_user.jpg)"></span> --> |
|||
<form id="head_img" action="<?php echo env('APP_API_URL').'/image_upload'; ?>" method="post" enctype="multipart/form-data"> |
|||
<img id="avator" src="<?php if($user_info['head_img']!=''){echo $user_info['head_img'];}else{echo env('APP_URL').'/images/weixin/no_user.jpg';} ?>"> |
|||
<input id="fileupload" type="file" name="file" style="display:none;"> |
|||
<input type="hidden" name="access_token" value="<?php echo $_SESSION['weixin_user_info']['access_token']; ?>"> |
|||
</form> |
|||
</div> |
|||
<div class="ui-list-info"> |
|||
<h4 class="ui-nowrap">头像</h4> |
|||
<div class="ui-reddot ui-reddot-static"></div> |
|||
</div> |
|||
<i id="avatorright" class="fa fa-angle-right" aria-hidden="true"></i> |
|||
</li> |
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/layer/mobile/layer.js"></script> |
|||
<script type="text/javascript" src="<?php echo env('APP_URL'); ?>/js/jquery-form.js"></script> |
|||
<script type="text/javascript"> |
|||
$(function(){ |
|||
$("#avator,#avatorright").click(function(){ |
|||
$("#fileupload").trigger("click"); |
|||
}); |
|||
|
|||
$("#fileupload").change(function(){ |
|||
$("#head_img").ajaxSubmit({ |
|||
dataType: 'json', |
|||
success: function(res) { |
|||
var img = res.data; |
|||
if(res.code==0) |
|||
{ |
|||
$("#avator").attr("src",img); |
|||
|
|||
$.post('<?php echo env('APP_API_URL').'/user_info_update'; ?>',{access_token:'<?php echo $_SESSION['weixin_user_info']['access_token']; ?>',head_img:img},function(res2) |
|||
{ |
|||
if(res2.code==0) |
|||
{ |
|||
//提示
|
|||
layer.open({ |
|||
content: '头像修改成功' |
|||
,skin: 'msg' |
|||
,time: 2 //2秒后自动关闭
|
|||
}); |
|||
} |
|||
},'json'); |
|||
} |
|||
}, |
|||
error:function(res){ |
|||
//files.html(res.responseText);
|
|||
} |
|||
}); |
|||
}); |
|||
}); |
|||
</script> |
|||
<li> |
|||
<div class="ui-list-info"> |
|||
<h4 class="ui-nowrap">用户名</h4> |
|||
<div class="ui-txt-info"><?php echo $user_info['user_name']; ?> </div>
|
|||
</div> |
|||
<i class="fa fa-angle-right" aria-hidden="true"></i> |
|||
</li> |
|||
<li> |
|||
<div class="ui-list-info"> |
|||
<h4 class="ui-nowrap">昵称</h4> |
|||
<div class="ui-txt-info"><?php echo $user_info['nickname']; ?> </div>
|
|||
</div> |
|||
<i class="fa fa-angle-right" aria-hidden="true"></i> |
|||
</li> |
|||
<li> |
|||
<div class="ui-list-info"> |
|||
<h4 class="ui-nowrap">性别</h4> |
|||
<div class="ui-txt-info"><?php if($user_info['sex']==0){echo '未知';}elseif($user_info['sex']==1){echo '男';}elseif($user_info['sex']==2){echo '女';} ?> </div>
|
|||
</div> |
|||
<i class="fa fa-angle-right" aria-hidden="true"></i> |
|||
</li> |
|||
</ul> |
|||
|
|||
<ul class="fui-list mt10"> |
|||
<li> |
|||
<div class="ui-list-info"> |
|||
<h4 class="ui-nowrap">修改密码</h4> |
|||
<div class="ui-txt-info"> </div> |
|||
</div> |
|||
<i class="fa fa-angle-right" aria-hidden="true"></i> |
|||
</li> |
|||
<li> |
|||
<div class="ui-list-info"> |
|||
<h4 class="ui-nowrap">支付密码</h4> |
|||
<div class="ui-txt-info"> </div> |
|||
</div> |
|||
<i class="fa fa-angle-right" aria-hidden="true"></i> |
|||
</li> |
|||
</ul> |
|||
<div class="setting"><div class="close"><a href="<?php echo route('weixin_user_logout'); ?>" id="logout">安全退出</a></div></div> |
|||
</div> |
|||
|
|||
@include('weixin.common.footer') |
|||
</body></html> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue