对于thinkphp整合微信支付代码分享感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thinkphp对接微信支付,并为您提供关于PHP编程:Thinkphp和onethink实现微信支付插件
对于thinkphp整合微信支付代码分享感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thinkphp对接微信支付,并为您提供关于PHP编程:Thinkphp和onethink实现微信支付插件、ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 使用微信支付V3的有用信息。
本文目录一览:- thinkphp整合微信支付代码分享(thinkphp对接微信支付)
- PHP编程:Thinkphp和onethink实现微信支付插件
- ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)
- ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)
- ThinkPHP 使用微信支付V3
thinkphp整合微信支付代码分享(thinkphp对接微信支付)
本文实例为大家分享了thinkPHP整合微信支付代码,供大家参考,具体内容如下
下载:PHPwxPay(jb51.cc).rar">支付SDK
将微信支付SDK放在第三方类库vendor下面,请切记PHP里面的商户信息修改为您的公众号信息,以避免造成资金的流失。
PHP端代码
HTML端代码
就这么简单。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。
PHP编程:Thinkphp和onethink实现微信支付插件
《ThinkPHP和onethink实现微信支付插件》要点:
本文介绍了ThinkPHP和onethink实现微信支付插件,希望对您有用。如果有疑问,可以联系我们。
PHP实例thinkPHP和微支付实现的微信支付插件,在微信中调用微信jssdk实现支付,这里有详细的代码和教程,具体看这里:
PHP实例
//实现的Wxpay钩子办法
public function Wxpay($param){
require './Addons/Wxpay/WxPayPubHelper/WxPayPubHelper.PHP';
$jsApi = new \JsApi_pub();
//=========步骤1:网页授权获取用户openid============
if (!isset($_GET['code']))
{
//触发微信返回code码
$url = $jsApi->createOauthUrlForCode(\WxPayConf_pub::JS_API_CALL_URL.'/order_id/'.$param['order_id']);
Header("Location: $url");
}else
{
$order_id = $param['order_id'];
$info = M('Order')->where('id='.$order_id)->find();
if(empty($info) || $info['is_pay'] == 1){
dump('该订单不存在或已支付'.$order_id);
exit();
}
$this->assign('info',$info);
$a = $info['money'];
$b = 100;
$c = $a * $b;
//获取code码,以获取openid
$code = $_GET['code'];
$jsApi->setCode($code);
$openid = $jsApi->getopenId();
}
//=========步骤2:使用统一支付接口,获取prepay_id============
//使用统一支付接口
$unifiedOrder = new \UnifiedOrder_pub();
$unifiedOrder->setParameter("openid","$openid");//商品描述
$unifiedOrder->setParameter("body","在线预订");//商品描述
//自定义订单号,此处仅作举例
$timeStamp = time();
// $out_Trade_no = \WxPayConf_pub::APPID."$timeStamp";
$out_Trade_no = $info['ordersn'];
$unifiedOrder->setParameter("out_Trade_no","$out_Trade_no");//商户订单号
$unifiedOrder->setParameter("total_fee","$c");//总金额
$unifiedOrder->setParameter("notify_url",\WxPayConf_pub::NOTIFY_URL.'/order_id/'.$param['order_id']);//通知地址
$unifiedOrder->setParameter("Trade_type","JSAPI");//交易类型
$prepay_id = $unifiedOrder->getPrepayId();
//=========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
$this->assign('jsApiParameters',$jsApiParameters);
$this->display('pay');
}
PHP实例以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助.
小编培训学院每天发布《ThinkPHP和onethink实现微信支付插件》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。
ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)
Pay.php支付控制器
<?php
// +----------------------------------------------------------------------
// | YFCMS [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://xueding.vip All rights reserved.
// +----------------------------------------------------------------------
// | Author: XueDing_ <361169632@qq.com>
// +----------------------------------------------------------------------
namespace app\phone\controller;
use think\Db;
use think\Request;
use think\Session;
use think\Cookie;
use app\phone\model\Weixin;
use app\phone\model\Weixin_pay;
use app\phone\model\Alipay;
class Pay extends controller
{
public function _initialize()
{
$this->alipay_config = array(
//应用ID,您的APPID。
''app_id'' => ''your app_id'',
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
''alipay_public_key'' => ''your alipay_public_key'',
//商户私钥,您的原始格式RSA私钥
''merchant_private_key'' => ''your merchant_private_key'',
//异步通知地址
''notify_url'' => "your notify_url",
//同步跳转
''return_url'' => "your return_url",
//编码格式
''charset'' => "UTF-8",
//签名方式
''sign_type'' => "RSA2",
//支付宝网关
''gatewayUrl'' => "https://openapi.alipay.com/gateway.do",
//支付宝partner,2088开头数字
''partner'' => ''your partner'',
//支付宝密钥
''md5_key'' => ''your key''
);
$this->wechat_config = array(
//您的APPID
''app_id'' => ''your app_id'',
//您的md5_key
''md5_key'' => ''your md5_key'',
//您的mch_id
''mch_id'' => ''your mch_id'',
//您的appsecret
''appsecret'' => ''your appsecret'',
//您的回调地址可以在这里配置使用方法的时候传,也可以在模型里面配置。
''notify_url'' => ''your notify_url'',
);
}
/*
微信h5支付
*/
public function wechat_pay()
{
if (input(''post.token'') == TOKEN) {
// 判断用户是在微信浏览器打开还是其他浏览器打开。
$userAgent = $_SERVER[''HTTP_USER_AGENT''];
if (strpos($userAgent, ''MicroMessenger'')) {
$wechat = new Weixin($this->wechat_config[''appsecret''], $this->wechat_config[''app_id'']);
$wechat_pay = new Weixin_pay($this->wechat_config[''appsecret''], $this->wechat_config[''app_id''], $this->wechat_config[''md5_key''], $this->wechat_config[''mch_id'']);
$code = input(''post.code'');
if (session::has(''openid'')) {
$openid = session::get(''openid'');
$total_fee = 1;
$out_trade_no = ''12345678945641231'';
$body = "充值金币支付测试";
$res = $wechat_pay->pay($openid, $total_fee, $body, $out_trade_no);
$arr[''errcode''] = ''0'';
$arr[''errmsg''] = ''ok'';
$arr[''url''] = ''本控制器下的地址/'' . ''wx?data='' . $res;
$data = json_encode($arr);
} else {
if (!empty($code)) {
$res = $wechat->get_access_token($code);
$userinfo = $wechat->get_openid_userinfo($res[''access_token''], $res[''openid'']);
$openid = $userinfo[''openid''];
session::set(''openid'', $openid);
$total_fee = 1;
$out_trade_no = ''12345678945641231'';
$body = "充值金币支付测试";
$res = $wechat_pay->pay($openid, $total_fee, $body, $out_trade_no);
$arr[''errcode''] = ''0'';
$arr[''errmsg''] = ''ok'';
$arr[''url''] = ''本控制器下的地址/'' . ''wx?data='' . $res;
$data = json_encode($arr);
} else {
$link = ''http://'' . $_SERVER[''HTTP_HOST''] . ''/#/cz''; // 前端充值金币页面地址。
cookie::set(''url'', $link, 300);
//$link 这个地址是在微信打开你项目时才会需要的,地址后面带上获取的code进行获取access_token。
$res = $wechat->code_shouquan($link);
$arr[''errcode''] = ''0'';
$arr[''errmsg''] = ''ok'';
$arr[''url''] = $res;
$data = json_encode($arr);
}
}
} else {
//非微信浏览器
$wechat_pay = new Weixin_pay($this->wechat_config[''appsecret''], $this->wechat_config[''app_id''], $this->wechat_config[''md5_key''], $this->wechat_config[''mch_id'']);
//h5支付不用传递openid 此处与微信jsapi支付不同
$openid = "";
$total_fee = 1;
$out_trade_no = ''12345678945641231'';
$body = "充值金币h5支付测试";
$res = $wechat_pay->payh5($openid, $total_fee, $body, $out_trade_no);
$arr[''errcode''] = ''0'';
$arr[''errmsg''] = ''ok'';
$arr[''url''] = $res[''mweb_url''];//微信唤起H5支付地址
$data = json_encode($arr);
}
} else {
$data = ''{"errcode":"1001","errmsg":"TOKEN无效"}'';
}
echo $data;
}
/*
在微信打开的时候唤起微信公众号支付。
*/
public function wx()
{
$data = input(''get.data'');
$this->assign(''data'', $data);
return view();
}
/*
获取微信code
*/
public function code()
{
$code = input(''param.code'');
$this->redirect(cookie::get(''url'') . ''?code='' . $code);
}
/*
微信回调
*/
public function wechat_notify()
{
$ccc = file_get_contents(''php://input'');
$Weixin_pay = new Weixin_pay();
$data = $Weixin_pay->xmlToArray($ccc);
if ($data[''result_code''] == ''SUCCESS'' && $data[''return_code''] == ''SUCCESS'') {
//获取订单号
$Ordersn = $data[''out_trade_no''];//订单号
// 处理支付成功后的逻辑业务
}
}
/*
微信APP支付
*/
public function app_wechat_pay()
{
if (input(''post.token'') == TOKEN) {
$wechat_pay = new Weixin_pay($this->wechat_config[''appsecret''], $this->wechat_config[''app_id''], $this->wechat_config[''md5_key''], $this->wechat_config[''mch_id'']);
//h5支付不用传递openid 此处与微信jsapi支付不同
$openid = "";
$total_fee = 1;
$body = "充值金币APP支付测试";
$order_sn = 123456789;//订单号
$res = $wechat_pay->app_pay($body, $order_sn, $total_fee);
if ($res[''prepay_id'']) {//判断返回参数中是否有prepay_id
$order = $wechat_pay->getOrder($res[''prepay_id'']);//执行二次签名返回参数
$arr[''errcode''] = ''0'';
$arr[''errmsg''] = ''ok'';
$arr[''order''] = $order;
$data = json_encode($arr);
} else {
$arr[''errcode''] = ''1003'';
$arr[''errmsg''] = $res[''err_code_des''];
$data = json_encode($arr);
}
} else {
$data = ''{"errcode":"1001","errmsg":"TOKEN无效"}'';
}
echo $data;
}
/*
支付宝开始支付
*/
public function alipay()
{//发起支付宝支付
if (input(''post.token'') == TOKEN) {
$link = ''http://'' . $_SERVER[''HTTP_HOST''] . ''/#/cz'';
cookie::set(''url'', $link, 300);
$res[''out_trade_no''] = 123456798123;
$res[''subject''] = ''充值'';
$res[''body''] = ''测试'';
$res[''money''] = 0.01;
$Pay = new Alipay($this->alipay_config[''partner''], $this->alipay_config[''md5_key'']);
$result = $Pay->alipay([
''notify_url'' => ''your notify_url'',
''return_url'' => ''your return_url'',
''out_trade_no'' => $res[''out_trade_no''],
''subject'' => $res[''subject''],
''total_fee'' => $res[''money''],
''body'' => $res[''body''],
]);
$arr[''errcode''] = ''0'';
$arr[''errmsg''] = ''ok'';
return $result[''msg''];
} else {
$data = ''{"errcode":"1001","errmsg":"TOKEN无效"}'';
}
echo $data;
}
/*
支付宝回调
*/
public function alipay_notify()
{//异步订单通知
$wx = sys_config_get(''payment'');
$Pay = new Alipay($wx[''aliwappay''][''partner''], $wx[''aliwappay''][''md5_key'']);
$out_trade_no = input(''out_trade_no'');
$trade_status = input(''trade_status'');
if ($trade_status == ''TRADE_SUCCESS'') {
// 处理支付成功后的逻辑业务
} else {
// 处理支付失败后的逻辑业务
}
}
}
模型:Weixin.php
<?php
namespace app\phone\model;
use think\Db;
use think\Validate;
use think\Loader;
use think\Model;
class Weixin extends model
{
protected $appScrect;
protected $appId;
public function __construct($appScrect = "", $appId = "")
{
$this->appScrect = $appScrect;
$this->appId = $appId;
}
/*
* 因为本项目需求,前端是Vue后台是TP5两个项目不在一个服务器所以我的url是return 回控制器通过接口返回给前端
* 如果是正常html页面可以使用header("Location: $url"); 以下方法都是
* */
public function code_shouquan($link)
{
$redirect_uri = urlencode(''网址/pay/code'');//微信获取网页授权地址
// 1、引导用户进入授权页面同意授权,获取code
// 2、通过code换取网页授权access_token
// 3、如果需要,开发者可以刷新网页授权access_token,避免过期
// 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appId . "&redirect_uri=" . $redirect_uri . "&response_type=code&scope=snsapi_userinfo&state=1234#wechat_redirect";
return $url;
}
public function get_access_token($code)
{
//检测缓存中是否有access_token(2小时),如果存在直接返回,不存在则检测缓存中的refresh_token(30天),
// refresh_token如果存在调用刷新缓存;如果不存在重新发起授权code授权
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appId . "&secret=" . $this->appScrect . "&code=" . $code . "&grant_type=authorization_code";
$res = $this->sendRequest($url);
return $res;
}
public function get_refresh_token($refresh_token)
{
$url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" . $this->appId . "&grant_type=refresh_token&refresh_token=" . $refresh_token;
$res = $this->sendRequest($url);
return $res;
}
public function get_openid_userinfo($access_token, $openid)
{
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $access_token . "&openid=" . $openid . "&lang=zh_CN";
$res = $this->sendRequest($url);
return $res;
}
/*
发送请求
*/
public function sendRequest($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output, true);
}
}
Weixin.php
<?php
namespace app\phone\model;
use think\Db;
use think\Validate;
use think\Loader;
use think\Model;
class Weixin_pay extends model
{
protected $appScrect;//微信公众平台的appscrect
protected $appId;//微信公众平台appid
protected $key;//微信商户平台配置的秘钥
protected $mch_id;//微信商户号
protected $values = array();
public function __construct($appScrect="",$appId="", $key="",$mch_id =''''){
$this->appScrect=$appScrect;
$this->appId=$appId;
$this->key=$key;
$this->mch_id=$mch_id;
}
public function app_pay($body, $out_trade_no, $total_fee){
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$notify_url = '''';//可以在这填写回调地址也可以增加一个参数传过来。也可以直接在构造里面加一个notify_url地址
$onoce_str = $this->createNoncestr();
$data["appid"] = $this->appId;
$data["body"] = $body;
$data["mch_id"] = $this->mch_id;
$data["nonce_str"] = $onoce_str;
$data["notify_url"] = $notify_url;
$data["out_trade_no"] = $out_trade_no;
$data["spbill_create_ip"] = $this->get_client_ip();
$data["total_fee"] = $total_fee;
$data["trade_type"] = "APP";
$sign = $this->getSign($data);
$data["sign"] = $sign;
$xml = $this->arrayToXml($data);
$response = $this->postXmlCurl($xml, $url);
// return $xml;
//将微信返回的结果xml转成数组
$response = $this->xmlToArray($response);
//返回数据
return $response;
}
//执行第二次签名,才能返回给客户端使用
public function getOrder($prepayId){
$data["appid"] = $this->appId;
$data["noncestr"] = $this->createNoncestr();;
$data["package"] = "Sign=WXPay";
$data["partnerid"] = $this->mch_id;
$data["prepayid"] = $prepayId;
$data["timestamp"] = time();
$s = $this->getSign($data, false);
$data["sign"] = $s;
return $data;
}
/*
公众号支付
*/
public function pay($openid,$total_fee,$body,$out_trade_no){
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$notify_url = '''';
$onoce_str = $this->createNoncestr();
$data["appid"] = $this->appId;
$data["body"] = $body;
$data["mch_id"] = $this->mch_id;
$data["nonce_str"] = $onoce_str;
$data["notify_url"] = $notify_url;
$data["out_trade_no"] = $out_trade_no;
$data["spbill_create_ip"] = $this->get_client_ip();
$data["total_fee"] = $total_fee;
$data["trade_type"] = "JSAPI";
$data["openid"] = $openid;
$sign = $this->getSign($data);
$data["sign"] = $sign;
$xml = $this->arrayToXml($data);
$response = $this->postXmlCurl($xml, $url);
//将微信返回的结果xml转成数组
$response = $this->xmlToArray($response);
$jsapi=array();
$timeStamp = time();
$jsapi[''appId'']=($response["appid"]);
$jsapi[''timeStamp'']=("$timeStamp");
$jsapi[''nonceStr'']=($this->createNoncestr());
$jsapi[''package'']=("prepay_id=" . $response[''prepay_id'']);
$jsapi[''signType'']=("MD5");
$jsapi[''paySign'']=($this->getSign($jsapi));
$parameters = json_encode($jsapi);
// halt($jsapi);
//请求数据,统一下单
return $parameters;
}
public function payh5($openid,$total_fee,$body,$out_trade_no){
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$notify_url = '''';
$onoce_str = $this->createNoncestr();
$data["appid"] = $this->appId;
$data["body"] = $body;
$data["mch_id"] = $this->mch_id;
$data["nonce_str"] = $onoce_str;
$data["notify_url"] = $notify_url;
$data["out_trade_no"] = $out_trade_no;
$data["spbill_create_ip"] = $this->get_client_ip();
$data["total_fee"] = $total_fee;
$data["trade_type"] = "MWEB";
$data["scene_info"] = "{''h5_info'': {''type'':''Wap'',''wap_url'': $notify_url,''wap_name'': ''测试充值''}}";
$sign = $this->getSign($data);
$data["sign"] = $sign;
$xml = $this->arrayToXml($data);
// return $data;
$response = $this->postXmlCurl($xml, $url);
//将微信返回的结果xml转成数组
$response = $this->xmlToArray($response);
//请求数据,统一下单
return $response;
}
public static 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;
}
// /*生成签名*/
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->key;
//echo "【string2】".$String."</br>";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."</br>";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."</br>";
return $result_;
}
/**
* 作用:产生随机字符串,不长于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;
}
//数组转xml
public 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, 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);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
}else{
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."<br>";
curl_close($ch);
return false;
}
}
/*
获取当前服务器的IP
*/
public function get_client_ip(){
if(getenv(''HTTP_CLIENT_IP'') && strcasecmp(getenv(''HTTP_CLIENT_IP''),''unknown'')) {
$ip = getenv(''HTTP_CLIENT_IP'');
} elseif(getenv(''HTTP_X_FORWARDED_FOR'') && strcasecmp(getenv(''HTTP_X_FORWARDED_FOR''),''unknown'')) {
$ip = getenv(''HTTP_X_FORWARDED_FOR'');
} elseif(getenv(''REMOTE_ADDR'') && strcasecmp(getenv(''REMOTE_ADDR''),''unknown'')) {
$ip = getenv(''REMOTE_ADDR'');
} elseif(isset($_SERVER[''REMOTE_ADDR'']) && $_SERVER[''REMOTE_ADDR''] && strcasecmp($_SERVER[''REMOTE_ADDR''], ''unknown'')) {
$ip = $_SERVER[''REMOTE_ADDR''];
}
return preg_match ( ''/[\d\.]{7,15}/'', $ip, $matches ) ? $matches [0] : '''';
}
/**
* 作用:格式化参数,签名过程需要使用
*/
public function formatBizQueryParaMap($paraMap, $urlencode){
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v){
if($urlencode){
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0){
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
public function MakeSign($unifiedorder)
{
$this->values=$unifiedorder;
//签名步骤一:按字典序排序参数
// ksort($this->values);
$string = $this->ToUrlParams();
//halt($string);
//签名步骤二:在string后加入KEY
$string = $string . "&key=".$this->key;
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
public function ToUrlParams()
{
$buff = "";
foreach ($this->values as $k => $v)
{
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
function array2xml($array)
{
$xml=''<xml>'';
foreach($array as $key=>$val){
if(is_numeric($key)){
$key="item id=\"$key\"";
}else{
//去掉空格,只取空格之前文字为key
list($key,)=explode('' '',$key);
}
$xml.="<$key>";
$xml.=is_array($val)?$this->_array2xml($val):$val;
//去掉空格,只取空格之前文字为key
list($key,)=explode('' '',$key);
$xml.="</$key>";
}
$xml.="</xml>";
return $xml;
}
function xml2array($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, ''SimpleXMLElement'', LIBXML_NOCDATA)), true);
return $values;
}
public function request_post($url = '''', $param = '''')
{
if (empty($url) || empty($param)) {
return false;
}
$postUrl = $url;
$curlPost = $param;
$ch = curl_init(); //初始化curl
curl_setopt($ch, CURLOPT_URL, $postUrl); //抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0); //设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1); //post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec($ch); //运行curl
curl_close($ch);
return $data;
}
function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
{
$ch = curl_init();
//curl_setopt($ch,CURLOPT_VERBOSE,''1'');
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_SSLCERTTYPE,''PEM'');
curl_setopt($ch,CURLOPT_SSLCERT,''/data/cert/php.pem'');
curl_setopt($ch,CURLOPT_SSLCERTPASSWD,''1234'');
curl_setopt($ch,CURLOPT_SSLKEYTYPE,''PEM'');
curl_setopt($ch,CURLOPT_SSLKEY,''/data/cert/php_private.pem'');
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
$data = curl_exec($ch);
curl_close($ch);
if($data){
return $data;
}else{
return false;
}
}
}
Alipay.php
<?php
namespace app\phone\model;
use think\Validate;
use think\Log;
use think\Model;
use lib\AlipaySubmit;
class Alipay extends Model
{
protected $partner;
protected $md5_key;
public function __construct($partner = "", $md5_key = "")
{
$this->partner = $partner;
$this->md5_key = $md5_key;
}
public static $alipay_config = [
// ''partner'' => '''',//支付宝partner,2088开头数字
// ''seller_id'' => '''',//支付宝partner,2088开头数字
// ''key'' => '''',//支付宝密钥
''sign_type'' => ''MD5'',
''input_charset'' => ''utf-8'',
''cacert'' => '''',
''transport'' => ''http'',
''payment_type'' => ''1'',
''service'' => '''',//https://docs.open.alipay.com/api_1 看你需要哪个API接口
''anti_phishing_key'' => '''',
''exter_invoke_ip'' => '''',
''app_pay'' => ''Y'',
];
public function alipay($data = [])
{//发起支付宝支付
$validate = new Validate([
[''out_trade_no'', ''require|alphaNum'', ''订单编号输入错误1|订单编号输入错误2''],
[''total_fee'', ''require|number|gt:0'', ''金额输入错误|金额输入错误|金额输入错误''],
[''subject'', ''require'', ''请输入标题''],
[''body'', ''require'', ''请输入描述''],
[''notify_url'', ''require'', ''异步通知地址不为空''],
]);
if (!$validate->check($data)) {
return [''code'' => 0, ''msg'' => $validate->getError()];
}
$config = self::$alipay_config;
$config[''partner''] = $this->partner;
$config[''seller_id''] = $this->partner;
$config[''key''] = $this->md5_key;
vendor(''alipay.alipay'');
$parameter = [
"service" => $config[''service''],
"partner" => $config[''partner''],
"seller_id" => $config[''seller_id''],
"payment_type" => $config[''payment_type''],
"notify_url" => $data[''notify_url''],
"return_url" => $data[''return_url''],
"anti_phishing_key" => $config[''anti_phishing_key''],
"exter_invoke_ip" => $config[''exter_invoke_ip''],
"out_trade_no" => $data[''out_trade_no''],
"subject" => $data[''subject''],
"total_fee" => $data[''total_fee''],
"body" => $data[''body''],
"_input_charset" => $config[''input_charset''],
''app_pay'' => ''Y'',
];
$alipaySubmit = new AlipaySubmit($config);
return [''code'' => 1, ''msg'' => $alipaySubmit->buildRequestForm($parameter, "get", "确认")];
}
}
?>
支付宝需要的submit文件:点击下载
wx.html在使用微信客户端支付时需要的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>微信公众号支付</title>
</head>
<body>
<script>
function getOrder() {
onBridgeReady();
}
function onBridgeReady() {
var data = {$data};
WeixinJSBridge.invoke(
''getBrandWCPayRequest'', data,
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
location.href = ''http://book.yueyuecms.com/#/me''
} else {
// alert(res.err_code+res.err_desc+res.err_msg); // 显示错误信息
location.href = ''http://book.yueyuecms.com/#/me''
}
}
);
}
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener(''WeixinJSBridgeReady'', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent(''WeixinJSBridgeReady'', onBridgeReady);
document.attachEvent(''onWeixinJSBridgeReady'', onBridgeReady);
}
} else {
onBridgeReady();
}
</script>
</body>
</html>
Author:XueDing_
Email:361169632@qq.com
注明出处:https://www.cnblogs.com/best-always/p/10291310.html
ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)
Pay.PHP支付控制器
<span>use<span> think\Request;
<span>use<span> think\Session;
<span>use<span> think\Cookie;
<span>use<span> app\phone\model\<span>Weixin;
<span>use<span> app\phone\model\<span>Weixin_pay;
<span>use<span> app\phone\model\<span>Alipay;
<span>class Pay <span>extends<span> controller
{
<span>public <span>function<span> _initialize()
{
<span>$this->alipay_config = <span>array<span>(
<span>//<span>应用ID,您的APPID。
'app_id' => '<span>your app_id',<span>//<span>支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => '<span>your alipay_public_key',<span>//<span>商户私钥,您的原始格式RSA私钥
'merchant_private_key' => '<span>your merchant_private_key',<span>//<span>异步通知地址
'notify_url' => "<span>your notify_url",<span>//<span>同步跳转
'return_url' => "<span>your return_url",<span>//<span>编码格式
'charset' => "UTF-8",<span>//<span>签名方式
'sign_type' => "RSA2",<span>//<span>支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",<span>//<span>支付宝partner,2088开头数字
'partner' => '<span>your partner',<span>//<span>支付宝密钥
'md5_key' => '<span>your key'<span>
);
<span>$this->wechat_config = <span>array<span>(
<span>//<span>您的APPID
'app_id' => '<span>your app_id',<span>//<span>您的md5_key
'md5_key' => '<span>your md5_key',<span>//<span>您的mch_id
'mch_id' => '<span>your mch_id',<span>//<span>您的appsecret
'appsecret' => '<span>your appsecret',<span>//<span>您的回调地址可以在这里配置使用方法的时候传,也可以在模型里面配置。
'notify_url' => '<span>your notify_url',<span>
);
}
</span><span>/*</span><span>
微信h5支付
</span><span>*/</span>
<span>public</span> <span>function</span><span> wechat_pay()
{
</span><span>if</span> (input('post.token') ==<span> TOKEN) {
</span><span>//</span><span> 判断<a href="https://www.jb51.cc/tag/yonghu/" target="_blank">用户</a>是在微信浏览器打开还是其他浏览器打开。</span>
<span>$userAgent</span> = <span>$_SERVER</span>['HTTP_USER_AGENT'<span>];
</span><span>if</span> (<span>strpos</span>(<span>$userAgent</span>,'MicroMessenger'<span>)) {
</span><span>$wechat</span> = <span>new</span> Weixin(<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['app_id'<span>]);
</span><span>$wechat_pay</span> = <span>new</span> Weixin_pay(<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['app_id'],<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['md5_key'],<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['mch_id'<span>]);
</span><span>$code</span> = input('post.code'<span>);
</span><span>if</span> (session::has('openid'<span>)) {
</span><span>$openid</span> = session::get('openid'<span>);
</span><span>$total_fee</span> = 1<span>;
</span><span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = '12345678945641231'<span>;
</span><span>$body</span> = "充值金币支付测试"<span>;
</span><span>$res</span> = <span>$wechat_pay</span>->pay(<span>$openid</span>,<span>$total_fee</span>,<span>$body</span>,<span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>);
</span><span>$arr</span>['errcode'] = '0'<span>;
</span><span>$arr</span>['errmsg'] = 'ok'<span>;
</span><span>$arr</span>['url'] = '本控制器下的地址/' . 'wx?data=' . <span>$res</span><span>;
</span><span>$data</span> = json_encode(<span>$arr</span><span>);
} </span><span>else</span><span> {
</span><span>if</span> (!<span>empty</span>(<span>$code</span><span>)) {
</span><span>$res</span> = <span>$wechat</span>->get_access_token(<span>$code</span><span>);
</span><span>$userinfo</span> = <span>$wechat</span>->get_openid_userinfo(<span>$res</span>['access_token'],<span>$res</span>['openid'<span>]);
</span><span>$openid</span> = <span>$userinfo</span>['openid'<span>];
session</span>::set('openid',<span>$openid</span><span>);
</span><span>$total_fee</span> = 1<span>;
</span><span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = '12345678945641231'<span>;
</span><span>$body</span> = "充值金币支付测试"<span>;
</span><span>$res</span> = <span>$wechat_pay</span>->pay(<span>$openid</span>,<span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>);
</span><span>$arr</span>['errcode'] = '0'<span>;
</span><span>$arr</span>['errmsg'] = 'ok'<span>;
</span><span>$arr</span>['url'] = '本控制器下的地址/' . 'wx?data=' . <span>$res</span><span>;
</span><span>$data</span> = json_encode(<span>$arr</span><span>);
} </span><span>else</span><span> {
</span><span>$link</span> = 'http://' . <span>$_SERVER</span>['HTTP_HOST'] . '/#/cz'; <span>//</span><span> 前端充值金币<a href="https://www.jb51.cc/tag/yemiandizhi/" target="_blank">页面地址</a>。</span>
cookie::set('url',<span>$link</span>,300<span>);
</span><span>//</span><span>$link 这个地址是在微信打开你项目时才会需要的,地址后面带上<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>的code进行<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>access_token。</span>
<span>$res</span> = <span>$wechat</span>->code_shouquan(<span>$link</span><span>);
</span><span>$arr</span>['errcode'] = '0'<span>;
</span><span>$arr</span>['errmsg'] = 'ok'<span>;
</span><span>$arr</span>['url'] = <span>$res</span><span>;
</span><span>$data</span> = json_encode(<span>$arr</span><span>);
}
}
} </span><span>else</span><span> {
</span><span>//</span><span>非微信浏览器</span>
<span>$wechat_pay</span> = <span>new</span> Weixin_pay(<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['mch_id'<span>]);
</span><span>//</span><span>h5支付不用传递openid 此处与微信jsapi支付不同</span>
<span>$openid</span> = ""<span>;
</span><span>$total_fee</span> = 1<span>;
</span><span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = '12345678945641231'<span>;
</span><span>$body</span> = "充值金币h5支付测试"<span>;
</span><span>$res</span> = <span>$wechat_pay</span>->payh5(<span>$openid</span>,<span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>);
</span><span>$arr</span>['errcode'] = '0'<span>;
</span><span>$arr</span>['errmsg'] = 'ok'<span>;
</span><span>$arr</span>['url'] = <span>$res</span>['mweb_url'];<span>//</span><span>微信唤起H5支付地址</span>
<span>$data</span> = json_encode(<span>$arr</span><span>);
}
} </span><span>else</span><span> {
</span><span>$data</span> = '{"errcode":"1001","errmsg":"TOKEN无效"}'<span>;
}
</span><span>echo</span> <span>$data</span><span>;
}
</span><span>/*</span><span>
在微信打开的时候唤起微信<a href="https://www.jb51.cc/tag/gongzhonghaozhifu/" target="_blank">公众号支付</a>。
</span><span>*/</span>
<span>public</span> <span>function</span><span> wx()
{
</span><span>$data</span> = input('get.data'<span>);
</span><span>$this</span>->assign('data',<span>$data</span><span>);
</span><span>return</span><span> view();
}
</span><span>/*</span><span>
<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>微信code
</span><span>*/</span>
<span>public</span> <span>function</span><span> code()
{
</span><span>$code</span> = input('p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m.code'<span>);
</span><span>$this</span>->redirect(cookie::get('url') . '?code=' . <span>$code</span><span>);
}
</span><span>/*</span><span>
微信回调
</span><span>*/</span>
<span>public</span> <span>function</span><span> wechat_notify()
{
</span><span>$ccc</span> = <span>file_get_contents</span>('<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>://input'<span>);
</span><span>$Weixin_pay</span> = <span>new</span><span> Weixin_pay();
</span><span>$data</span> = <span>$Weixin_pay</span>->xmlToArray(<span>$ccc</span><span>);
</span><span>if</span> (<span>$data</span>['result_code'] == 'SUCCESS' && <span>$data</span>['return_code'] == 'SUCCESS'<span>) {
</span><span>//</span><span><a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>订单号</span>
<span>$Ordersn</span> = <span>$data</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'];<span>//</span><span>订单号
// 处理支付成功后的逻辑业务</span>
<span> }
}
</span><span>/*</span><span>
微信APP支付
</span><span>*/</span>
<span>public</span> <span>function</span><span> app_wechat_pay()
{
</span><span>if</span> (input('post.token') ==<span> TOKEN) {
</span><span>$wechat_pay</span> = <span>new</span> Weixin_pay(<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span>$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['mch_id'<span>]);
</span><span>//</span><span>h5支付不用传递openid 此处与微信jsapi支付不同</span>
<span>$openid</span> = ""<span>;
</span><span>$total_fee</span> = 1<span>;
</span><span>$body</span> = "充值金币APP支付测试"<span>;
</span><span>$order_sn</span> = 123456789;<span>//</span><span>订单号</span>
<span>$res</span> = <span>$wechat_pay</span>->app_pay(<span>$body</span>,<span>$order_sn</span>,<span>$total_fee</span><span>);
</span><span>if</span> (<span>$res</span>['prepay_id']) {<span>//</span><span>判断返回参数中是否有prepay_id</span>
<span>$order</span> = <span>$wechat_pay</span>->g<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>rder(<span>$res</span>['prepay_id']);<span>//</span><span>执行二次签名返回参数</span>
<span>$arr</span>['errcode'] = '0'<span>;
</span><span>$arr</span>['errmsg'] = 'ok'<span>;
</span><span>$arr</span>['order'] = <span>$order</span><span>;
</span><span>$data</span> = json_encode(<span>$arr</span><span>);
} </span><span>else</span><span> {
</span><span>$arr</span>['errcode'] = '1003'<span>;
</span><span>$arr</span>['errmsg'] = <span>$res</span>['err_code_des'<span>];
</span><span>$data</span> = json_encode(<span>$arr</span><span>);
}
} </span><span>else</span><span> {
</span><span>$data</span> = '{"errcode":"1001","errmsg":"TOKEN无效"}'<span>;
}
</span><span>echo</span> <span>$data</span><span>;
}
</span><span>/*</span><span>
支付宝开始支付
</span><span>*/</span>
<span>public</span> <span>function</span><span> alipay()
{</span><span>//</span><span>发起支付宝支付</span>
<span>if</span> (input('post.token') ==<span> TOKEN) {
</span><span>$link</span> = 'http://' . <span>$_SERVER</span>['HTTP_HOST'] . '/#/cz'<span>;
cookie</span>::set('url',300<span>);
</span><span>$res</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'] = 123456798123<span>;
</span><span>$res</span>['subject'] = '充值'<span>;
</span><span>$res</span>['body'] = '测试'<span>;
</span><span>$res</span>['money'] = 0.01<span>;
</span><span>$Pay</span> = <span>new</span> Alipay(<span>$this</span>->alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['partner'],<span>$this</span>->alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['md5_key'<span>]);
</span><span>$result</span> = <span>$Pay</span>-><span>alipay([
</span>'notify_url' => 'your notify_url','return_url' => 'your return_url','out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no' => <span>$res</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'],'subject' => <span>$res</span>['subject'],'total_fee' => <span>$res</span>['money'],'body' => <span>$res</span>['body'],<span>
]);
</span><span>$arr</span>['errcode'] = '0'<span>;
</span><span>$arr</span>['errmsg'] = 'ok'<span>;
</span><span>return</span> <span>$result</span>['msg'<span>];
} </span><span>else</span><span> {
</span><span>$data</span> = '{"errcode":"1001","errmsg":"TOKEN无效"}'<span>;
}
</span><span>echo</span> <span>$data</span><span>;
}
</span><span>/*</span><span>
支付宝回调
</span><span>*/</span>
<span>public</span> <span>function</span><span> alipay_notify()
{</span><span>//</span><span>异步订单<a href="https://www.jb51.cc/tag/tongzhi/" target="_blank">通知</a></span>
<span>$wx</span> = sys_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>_get('payment'<span>);
</span><span>$Pay</span> = <span>new</span> Alipay(<span>$wx</span>['aliwappay']['partner'],<span>$wx</span>['aliwappay']['md5_key'<span>]);
</span><span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = input('out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'<span>);
</span><span>$<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_status</span> = input('<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_status'<span>);
</span><span>if</span> (<span>$<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_status</span> == '<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>E_SUCCESS'<span>) {
</span><span>//</span><span> 处理支付成功后的逻辑业务</span>
<span>
} <span>else<span> {
<span>//<span> 处理支付失败后的逻辑业务
<span> }
}
}
模型:Weixin.PHP
namespace app\phone\model;
<span>use<span> think\Db;
<span>use<span> think\Validate;
<span>use<span> think\Loader;
<span>use<span> think\Model;
<span>class Weixin <span>extends<span> model
{
<span>protected <span>$appScrect<span>;
<span>protected <span>$appId<span>;
</span><span>public</span> <span>function</span> __construct(<span>$appScrect</span> = "",<span>$appId</span> = ""<span>)
{
</span><span>$this</span>->appScrect = <span>$appScrect</span><span>;
</span><span>$this</span>->appId = <span>$appId</span><span>;
}
</span><span>/*</span><span>
* 因为本项目需求,前端是Vue<a href="https://www.jb51.cc/tag/houtai/" target="_blank">后台</a>是TP5两个项目不在<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>服务器所以我的url是return 回控制器通过接口返回给前端
* 如果是正常html<a href="https://www.jb51.cc/tag/yemian/" target="_blank">页面</a>可以使用header("Location: $url"); 以下<a href="https://www.jb51.cc/tag/fangfa/" target="_blank">方法</a>都是
* </span><span>*/</span>
<span>public</span> <span>function</span> code_shouquan(<span>$link</span><span>)
{
</span><span>$redirect_uri</span> = <span>urlencode</span>('网址/pay/code');<span>//</span><span>微信<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>网页授权地址
// 1、引导<a href="https://www.jb51.cc/tag/yonghu/" target="_blank">用户</a>进入授权<a href="https://www.jb51.cc/tag/yemian/" target="_blank">页面</a>同意授权,<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>code
// 2、通过code换取网页授权access_token
// 3、如果需要,开发者可以刷新网页授权access_token,避免过期
// 4、通过网页授权access_token和openid<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a><a href="https://www.jb51.cc/tag/yonghu/" target="_blank">用户</a>基本信息(<a href="https://www.jb51.cc/tag/zhichi/" target="_blank">支持</a>UnionID机制)</span>
<span>$url</span> = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . <span>$this</span>->appId . "&redirect_uri=" . <span>$redirect_uri</span> . "&response_type=code&s<a href="https://www.jb51.cc/tag/cop/" target="_blank">cop</a>e=snsapi_userinfo&state=1234#wechat_redirect"<span>;
</span><span>return</span> <span>$url</span><span>;
}
</span><span>public</span> <span>function</span> get_access_token(<span>$code</span><span>)
{
</span><span>//</span><span>检测缓存中是否有access_token(2小时),如果存在直接返回,不存在则检测缓存中的refresh_token(30天),// refresh_token如果存在<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank">调用</a>刷新缓存;如果不存在重新发起授权code授权</span>
<span>$url</span> = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . <span>$this</span>->appId . "&secret=" . <span>$this</span>->appScrect . "&code=" . <span>$code</span> . "&grant_type=authorization_code"<span>;
</span><span>$res</span> = <span>$this</span>->sendRequest(<span>$url</span><span>);
</span><span>return</span> <span>$res</span><span>;
}
</span><span>public</span> <span>function</span> get_refresh_token(<span>$refresh_token</span><span>)
{
</span><span>$url</span> = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" . <span>$this</span>->appId . "&grant_type=refresh_token&refresh_token=" . <span>$refresh_token</span><span>;
</span><span>$res</span> = <span>$this</span>->sendRequest(<span>$url</span><span>);
</span><span>return</span> <span>$res</span><span>;
}
</span><span>public</span> <span>function</span> get_openid_userinfo(<span>$access_token</span>,<span>$openid</span><span>)
{
</span><span>$url</span> = "https://api.weixin.qq.com/sns/userinfo?access_token=" . <span>$access_token</span> . "&openid=" . <span>$openid</span> . "&lang=zh_CN"<span>;
</span><span>$res</span> = <span>$this</span>->sendRequest(<span>$url</span><span>);
</span><span>return</span> <span>$res</span><span>;
}
</span><span>/*</span><span>
发送请求
<span>*/
<span>public <span>function sendRequest(<span>$url<span>)
{
<span>$ch =<span> curl_init();
curl_setopt(<span>$ch,CURLOPT_URL,<span>$url<span>);
curl_setopt(<span>$ch,CURLOPT_SSL_VERIFYPEER,<span>FALSE<span>);
curl_setopt(<span>$ch,CURLOPT_SSL_VERIFYHOST,CURLOPT_RETURNTRANSFER,1<span>);
<span>$output = curl_exec(<span>$ch<span>);
curl_close(<span>$ch<span>);
<span>return json_decode(<span>$output,<span>true<span>);
}
}
Weixin.PHP
{
<span>protected <span>$appScrect;<span>//<span>微信公众平台的appscrect
<span>protected <span>$appId;<span>//<span>微信公众平台appid
<span>protected <span>$key;<span>//<span>微信商户平台配置的秘钥
<span>protected <span>$mch_id;<span>//<span>微信商户号
<span>protected <span>$values = <span>array<span>();
</span><span>public</span> <span>function</span> __construct(<span>$appScrect</span>="",<span>$appId</span>="",<span>$key</span>="",<span>$mch_id</span> =''<span>){
</span><span>$this</span>->appScrect=<span>$appScrect</span><span>;
</span><span>$this</span>->appId=<span>$appId</span><span>;
</span><span>$this</span>-><span>key</span>=<span>$key</span><span>;
</span><span>$this</span>->mch_id=<span>$mch_id</span><span>;
}
</span><span>public</span> <span>function</span> app_pay(<span>$body</span>,<span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span>,<span>$total_fee</span><span>){
</span><span>$url</span> = "https://api.mch.weixin.qq.com/pay/unifiedorder"<span>;
</span><span>$notify_url</span> = '';<span>//</span><span>可以<a href="https://www.jb51.cc/tag/zaizhe/" target="_blank">在这</a>填写回调地址也可以<a href="https://www.jb51.cc/tag/zengjia/" target="_blank">增加</a><a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>参数传过来。也可以直接在构造里面加<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>notify_<a href="https://www.jb51.cc/tag/URLdizhi/" target="_blank">URL地址</a></span>
<span>$onoce_str</span> = <span>$this</span>-><span>createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;
</span><span>$data</span>["appid"] = <span>$this</span>-><span>appId;
</span><span>$data</span>["body"] = <span>$body</span><span>;
</span><span>$data</span>["mch_id"] = <span>$this</span>-><span>mch_id;
</span><span>$data</span>["nonce_str"] = <span>$onoce_str</span><span>;
</span><span>$data</span>["notify_url"] = <span>$notify_url</span><span>;
</span><span>$data</span>["out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no"] = <span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>;
</span><span>$data</span>["spbill_create_ip"] = <span>$this</span>-><span>get_client_ip();
</span><span>$data</span>["total_fee"] = <span>$total_fee</span><span>;
</span><span>$data</span>["<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_type"] = "APP"<span>;
</span><span>$sign</span> = <span>$this</span>->getSign(<span>$data</span><span>);
</span><span>$data</span>["sign"] = <span>$sign</span><span>;
</span><span>$xml</span> = <span>$this</span>->arrayToXml(<span>$data</span><span>);
</span><span>$response</span> = <span>$this</span>->postXmlCurl(<span>$xml</span>,<span>$url</span><span>);
</span><span>//</span><span> return $xml;
//将微信返回的结果xml转成数组</span>
<span>$response</span> = <span>$this</span>->xmlToArray(<span>$response</span><span>);
</span><span>//</span><span>返回数据</span>
<span>return</span> <span>$response</span><span>;
}
</span><span>//</span><span>执行第二次签名,才能返回给客户端使用</span>
<span>public</span> <span>function</span> g<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>rder(<span>$prepayId</span><span>){
</span><span>$data</span>["appid"] = <span>$this</span>-><span>appId;
</span><span>$data</span>["noncestr"] = <span>$this</span>-><span>createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;;
</span><span>$data</span>["package"] = "Sign=WXPay"<span>;
</span><span>$data</span>["partnerid"] = <span>$this</span>-><span>mch_id;
</span><span>$data</span>["prepayid"] = <span>$prepayId</span><span>;
</span><span>$data</span>["timestamp"] = <span>time</span><span>();
</span><span>$s</span> = <span>$this</span>->getSign(<span>$data</span>,<span>false</span><span>);
</span><span>$data</span>["sign"] = <span>$s</span><span>;
</span><span>return</span> <span>$data</span><span>;
}
</span><span>/*</span><span>
<a href="https://www.jb51.cc/tag/gongzhonghaozhifu/" target="_blank">公众号支付</a>
</span><span>*/</span>
<span>public</span> <span>function</span> pay(<span>$openid</span>,<span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>){
</span><span>$url</span> = "https://api.mch.weixin.qq.com/pay/unifiedorder"<span>;
</span><span>$notify_url</span> = ''<span>;
</span><span>$onoce_str</span> = <span>$this</span>-><span>createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;
</span><span>$data</span>["appid"] = <span>$this</span>-><span>appId;
</span><span>$data</span>["body"] = <span>$body</span><span>;
</span><span>$data</span>["mch_id"] = <span>$this</span>-><span>mch_id;
</span><span>$data</span>["nonce_str"] = <span>$onoce_str</span><span>;
</span><span>$data</span>["notify_url"] = <span>$notify_url</span><span>;
</span><span>$data</span>["out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no"] = <span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>;
</span><span>$data</span>["spbill_create_ip"] = <span>$this</span>-><span>get_client_ip();
</span><span>$data</span>["total_fee"] = <span>$total_fee</span><span>;
</span><span>$data</span>["<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_type"] = "JSAPI"<span>;
</span><span>$data</span>["openid"] = <span>$openid</span><span>;
</span><span>$sign</span> = <span>$this</span>->getSign(<span>$data</span><span>);
</span><span>$data</span>["sign"] = <span>$sign</span><span>;
</span><span>$xml</span> = <span>$this</span>->arrayToXml(<span>$data</span><span>);
</span><span>$response</span> = <span>$this</span>->postXmlCurl(<span>$xml</span>,<span>$url</span><span>);
</span><span>//</span><span>将微信返回的结果xml转成数组</span>
<span>$response</span> = <span>$this</span>->xmlToArray(<span>$response</span><span>);
</span><span>$jsapi</span>=<span>array</span><span>();
</span><span>$timeStamp</span> = <span>time</span><span>();
</span><span>$jsapi</span>['appId']=(<span>$response</span>["appid"<span>]);
</span><span>$jsapi</span>['timeStamp']=("<span>$timeStamp</span>"<span>);
</span><span>$jsapi</span>['nonceStr']=(<span>$this</span>-><span>createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>);
</span><span>$jsapi</span>['package']=("prepay_id=" . <span>$response</span>['prepay_id'<span>]);
</span><span>$jsapi</span>['signType']=("MD5"<span>);
</span><span>$jsapi</span>['paySign']=(<span>$this</span>->getSign(<span>$jsapi</span><span>));
</span><span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span> = json_encode(<span>$jsapi</span><span>);
</span><span>//</span><span> halt($jsapi);
//请求数据,统一下单 </span>
<span>return</span> <span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span><span>;
}
</span><span>public</span> <span>function</span> payh5(<span>$openid</span>,<span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>){
</span><span>$url</span> = "https://api.mch.weixin.qq.com/pay/unifiedorder"<span>;
</span><span>$notify_url</span> = ''<span>;
</span><span>$onoce_str</span> = <span>$this</span>-><span>createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;
</span><span>$data</span>["appid"] = <span>$this</span>-><span>appId;
</span><span>$data</span>["body"] = <span>$body</span><span>;
</span><span>$data</span>["mch_id"] = <span>$this</span>-><span>mch_id;
</span><span>$data</span>["nonce_str"] = <span>$onoce_str</span><span>;
</span><span>$data</span>["notify_url"] = <span>$notify_url</span><span>;
</span><span>$data</span>["out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no"] = <span>$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span>;
</span><span>$data</span>["spbill_create_ip"] = <span>$this</span>-><span>get_client_ip();
</span><span>$data</span>["total_fee"] = <span>$total_fee</span><span>;
</span><span>$data</span>["<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_type"] = "MWEB"<span>;
</span><span>$data</span>["scene_info"] = "{'h5_info': {'type':'Wap','wap_url': <span>$notify_url</span>,'wap_name': '测试充值'}}"<span>;
</span><span>$sign</span> = <span>$this</span>->getSign(<span>$data</span><span>);
</span><span>$data</span>["sign"] = <span>$sign</span><span>;
</span><span>$xml</span> = <span>$this</span>->arrayToXml(<span>$data</span><span>);
</span><span>//</span><span> return $data;</span>
<span>$response</span> = <span>$this</span>->postXmlCurl(<span>$xml</span>,<span>$url</span><span>);
</span><span>//</span><span>将微信返回的结果xml转成数组</span>
<span>$response</span> = <span>$this</span>->xmlToArray(<span>$response</span><span>);
</span><span>//</span><span>请求数据,统一下单 </span>
<span>return</span> <span>$response</span><span>;
}
</span><span>public</span> <span>static</span> <span>function</span> getNonceStr(<span>$length</span> = 32<span>)
{
</span><span>$chars</span> = "abcdefghijklm<a href="https://www.jb51.cc/tag/nop/" target="_blank">nop</a>qrstuvwxyz0123456789"<span>;
</span><span>$str</span> =""<span>;
</span><span>for</span> ( <span>$i</span> = 0; <span>$i</span> < <span>$length</span>; <span>$i</span>++<span> ) {
</span><span>$str</span> .= <span>substr</span>(<span>$chars</span>,<span>mt_rand</span>(0,<span>strlen</span>(<span>$chars</span>)-1),1<span>);
}
</span><span>return</span> <span>$str</span><span>;
}
</span><span>//</span><span> /*<a href="https://www.jb51.cc/tag/shengcheng/" target="_blank">生成</a>签名*/</span>
<span>public</span> <span>function</span> getSign(<span>$Obj</span><span>){
</span><span>foreach</span> (<span>$Obj</span> <span>as</span> <span>$k</span> => <span>$v</span><span>){
</span><span>$P<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span>[<span>$k</span>] = <span>$v</span><span>;
}
</span><span>//</span><span>签名步骤一:按字典序排序参数</span>
<span>ksort</span>(<span>$P<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span><span>);
</span><span>$String</span> = <span>$this</span>->formatBizQueryP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map(<span>$P<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span>,<span>false</span><span>);
</span><span>//</span><span>echo '【string1】'.$String.'</br>';
//签名步骤二:在string后加入KEY</span>
<span>$String</span> = <span>$String</span>."&key=".<span>$this</span>-><span>key</span><span>;
</span><span>//</span><span>echo "【string2】".$String."</br>";
//签名步骤三:MD5加密</span>
<span>$String</span> = <span>md5</span>(<span>$String</span><span>);
</span><span>//</span><span>echo "【string3】 ".$String."</br>";
//签名步骤四:所有字符转为大写</span>
<span>$result_</span> = <span>str<a href="https://www.jb51.cc/tag/toupper/" target="_blank">toupper</a></span>(<span>$String</span><span>);
</span><span>//</span><span>echo "【result】 ".$result_."</br>";</span>
<span>return</span> <span>$result_</span><span>;
}
</span><span>/*</span><span>*
* 作用:产生<a href="https://www.jb51.cc/tag/suiji/" target="_blank">随机</a>字符串,不长于32位
</span><span>*/</span>
<span>public</span> <span>function</span> createNoncestr( <span>$length</span> = 32<span> ){
</span><span>$chars</span> = "abcdefghijklm<a href="https://www.jb51.cc/tag/nop/" target="_blank">nop</a>qrstuvwxyz0123456789"<span>;
</span><span>$str</span> =""<span>;
</span><span>for</span> ( <span>$i</span> = 0; <span>$i</span> < <span>$length</span>; <span>$i</span>++<span> ) {
</span><span>$str</span>.= <span>substr</span>(<span>$chars</span>,1<span>);
}
</span><span>return</span> <span>$str</span><span>;
}
</span><span>//</span><span>数组转xml</span>
<span>public</span> <span>function</span> arrayToXml(<span>$arr</span><span>){
</span><span>$xml</span> = "<xml>"<span>;
</span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$key</span>=><span>$val</span><span>){
</span><span>if</span> (<span>is_numeric</span>(<span>$val</span><span>)){
</span><span>$xml</span>.="<".<span>$key</span>.">".<span>$val</span>."</".<span>$key</span>.">"<span>;
}</span><span>else</span><span>{
</span><span>$xml</span>.="<".<span>$key</span>."><![CDATA[".<span>$val</span>."]]></".<span>$key</span>.">"<span>;
}
}
</span><span>$xml</span>.="</xml>"<span>;
</span><span>return</span> <span>$xml</span><span>;
}
</span><span>/*</span><span>*
* 作用:将xml转为array
</span><span>*/</span>
<span>public</span> <span>function</span> xmlToArray(<span>$xml</span><span>){
</span><span>//</span><span>将XML转为array </span>
<span>$array_data</span> = json_decode(json_encode(<span>simplexml_load_string</span>(<span>$xml</span>,'SimpleXMLElement',LIBXML_NOCDATA)),<span>true</span><span>);
</span><span>return</span> <span>$array_data</span><span>;
}
</span><span>/*</span><span>*
* 作用:以post方式提交xml到对应的接口url
</span><span>*/</span>
<span>public</span> <span>function</span> postXmlCurl(<span>$xml</span>,<span>$url</span>,<span>$second</span>=30<span>){
</span><span>//</span><span>初始化curl </span>
<span>$ch</span> =<span> curl_init();
</span><span>//</span><span>设置超时</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,CURLOPT_TIMEOUT,<span>$second</span><span>);
</span><span>//</span><span>这里设置代理,如果有的话
//curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt($ch,CURLOPT_PROXY,'8.8.8.8');
//curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt($ch,CURLOPT_PROXYPORT,8080);</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,<span>FALSE</span><span>);
</span><span>//</span><span>设置header</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,CURLOPT_HEADER,<span>FALSE</span><span>);
</span><span>//</span><span>要求结果为字符串且<a href="https://www.jb51.cc/tag/shuchu/" target="_blank">输出</a>到屏幕上</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,<span>TRUE</span><span>);
</span><span>//</span><span>post提交方式</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,CURLOPT_POST,<span>TRUE</span><span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,CURLOPT_POSTFIELDS,<span>$xml</span><span>);
</span><span>//</span><span>运行curl</span>
<span>$data</span> = curl_exec(<span>$ch</span><span>);
</span><span>//</span><span>返回结果</span>
<span>if</span>(<span>$data</span><span>){
curl_close(</span><span>$ch</span><span>);
</span><span>return</span> <span>$data</span><span>;
}</span><span>else</span><span>{
</span><span>$error</span> = curl_errno(<span>$ch</span><span>);
</span><span>echo</span> "curl出错,<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>码:<span>$error</span>"."<br>"<span>;
curl_close(</span><span>$ch</span><span>);
</span><span>return</span> <span>false</span><span>;
}
}
</span><span>/*</span><span>
<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>当前服务器的IP
</span><span>*/</span>
<span>public</span> <span>function</span><span> get_client_ip(){
</span><span>if</span>(<span>getenv</span>('HTTP_CLIENT_IP') && <span>strcasecmp</span>(<span>getenv</span>('HTTP_CLIENT_IP'),'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span>)) {
</span><span>$ip</span> = <span>getenv</span>('HTTP_CLIENT_IP'<span>);
} </span><span>elseif</span>(<span>getenv</span>('HTTP_X_FORWARDED_FOR') && <span>strcasecmp</span>(<span>getenv</span>('HTTP_X_FORWARDED_FOR'),'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span>)) {
</span><span>$ip</span> = <span>getenv</span>('HTTP_X_FORWARDED_FOR'<span>);
} </span><span>elseif</span>(<span>getenv</span>('REMOTE_ADDR') && <span>strcasecmp</span>(<span>getenv</span>('REMOTE_ADDR'),'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span>)) {
</span><span>$ip</span> = <span>getenv</span>('REMOTE_ADDR'<span>);
} </span><span>elseif</span>(<span>isset</span>(<span>$_SERVER</span>['REMOTE_ADDR']) && <span>$_SERVER</span>['REMOTE_ADDR'] && <span>strcasecmp</span>(<span>$_SERVER</span>['REMOTE_ADDR'],'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span>)) {
</span><span>$ip</span> = <span>$_SERVER</span>['REMOTE_ADDR'<span>];
}
</span><span>return</span> <span>preg_match</span> ( '/[\d\.]{7,15}/',<span>$ip</span>,<span>$matches</span> ) ? <span>$matches</span> [0] : ''<span>;
}
</span><span>/*</span><span>*
* 作用:格式化参数,签名过程需要使用
</span><span>*/</span>
<span>public</span> <span>function</span> formatBizQueryP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map(<span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map</span>,<span>$urlencode</span><span>){
</span><span>$buff</span> = ""<span>;
</span><span>ksort</span>(<span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map</span><span>);
</span><span>foreach</span> (<span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map</span> <span>as</span> <span>$k</span> => <span>$v</span><span>){
</span><span>if</span>(<span>$urlencode</span><span>){
</span><span>$v</span> = <span>urlencode</span>(<span>$v</span><span>);
}
</span><span>$buff</span> .= <span>$k</span> . "=" . <span>$v</span> . "&"<span>;
}
</span><span>$reqPar</span><span>;
</span><span>if</span> (<span>strlen</span>(<span>$buff</span>) > 0<span>){
</span><span>$reqPar</span> = <span>substr</span>(<span>$buff</span>,<span>strlen</span>(<span>$buff</span>)-1<span>);
}
</span><span>return</span> <span>$reqPar</span><span>;
}
</span><span>public</span> <span>function</span> MakeSign(<span>$unifiedorder</span><span>)
{
</span><span>$this</span>->values=<span>$unifiedorder</span><span>;
</span><span>//</span>@H_<a href="https://www.jb51.cc/tag/301/" target="_blank">301</a>_1224@values);</span>
<span>$string</span> = <span>$this</span>-><span>ToUrlP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>ms();
</span><span>//</span><span>halt($string);
//签名步骤二:在string后加入KEY</span>
<span>$string</span> = <span>$string</span> . "&key=".<span>$this</span>-><span>key</span><span>;
</span><span>//</span><span>签名步骤三:MD5加密</span>
<span>$string</span> = <span>md5</span>(<span>$string</span><span>);
</span><span>//</span><span>签名步骤四:所有字符转为大写</span>
<span>$result</span> = <span>str<a href="https://www.jb51.cc/tag/toupper/" target="_blank">toupper</a></span>(<span>$string</span><span>);
</span><span>return</span> <span>$result</span><span>;
}
</span><span>public</span> <span>function</span><span> ToUrlP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>ms()
{
</span><span>$buff</span> = ""<span>;
</span><span>foreach</span> (<span>$this</span>->values <span>as</span> <span>$k</span> => <span>$v</span><span>)
{
</span><span>if</span>(<span>$k</span> != "sign" && <span>$v</span> != "" && !<span>is_array</span>(<span>$v</span><span>)){
</span><span>$buff</span> .= <span>$k</span> . "=" . <span>$v</span> . "&"<span>;
}
}
</span><span>$buff</span> = <span>trim</span>(<span>$buff</span>,"&"<span>);
</span><span>return</span> <span>$buff</span><span>;
}
</span><span>function</span> array2xml(<span>$array</span><span>)
{
</span><span>$xml</span>='<xml>'<span>;
</span><span>foreach</span>(<span>$array</span> <span>as</span> <span>$key</span>=><span>$val</span><span>){
</span><span>if</span>(<span>is_numeric</span>(<span>$key</span><span>)){
</span><span>$key</span>="item id=\"<span>$key</span>\""<span>;
}</span><span>else</span><span>{
</span><span>//</span><span>去掉空格,只取空格之前<a href="https://www.jb51.cc/tag/wenzi/" target="_blank">文字</a>为key</span>
<span>list</span>(<span>$key</span>,)=<span>explode</span>(' ',<span>$key</span><span>);
}
</span><span>$xml</span>.="<<span>$key</span>>"<span>;
</span><span>$xml</span>.=<span>is_array</span>(<span>$val</span>)?<span>$this</span>->_array2xml(<span>$val</span>):<span>$val</span><span>;
</span><span>//</span><span>去掉空格,只取空格之前<a href="https://www.jb51.cc/tag/wenzi/" target="_blank">文字</a>为key</span>
<span>list</span>(<span>$key</span>,<span>$key</span><span>);
</span><span>$xml</span>.="</<span>$key</span>>"<span>;
}
</span><span>$xml</span>.="</xml>"<span>;
</span><span>return</span> <span>$xml</span><span>;
}
</span><span>function</span> xml2array(<span>$xml</span><span>)
{
</span><span>//</span><span><a href="https://www.jb51.cc/tag/jinzhi/" target="_blank">禁止</a>引用外部xml实体</span>
libxml_<a href="https://www.jb51.cc/tag/dis/" target="_blank">dis</a>able_entity_loader(<span>true</span><span>);
</span><span>$values</span> = json_decode(json_encode(<span>simplexml_load_string</span>(<span>$xml</span>,<span>true</span><span>);
</span><span>return</span> <span>$values</span><span>;
}
</span><span>public</span> <span>function</span> request_post(<span>$url</span> = '',<span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m</span> = ''<span>)
{
</span><span>if</span> (<span>empty</span>(<span>$url</span>) || <span>empty</span>(<span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m</span><span>)) {
</span><span>return</span> <span>false</span><span>;
}
</span><span>$postUrl</span> = <span>$url</span><span>;
</span><span>$curlPost</span> = <span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m</span><span>;
</span><span>$ch</span> = curl_init(); <span>//</span><span>初始化curl</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,<span>$postUrl</span>); <span>//</span><span>抓取指定网页</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,0); <span>//</span><span>设置header</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,1); <span>//</span><span>要求结果为字符串且<a href="https://www.jb51.cc/tag/shuchu/" target="_blank">输出</a>到屏幕上</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,1); <span>//</span><span>post提交方式</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,<span>$curlPost</span><span>);
</span><span>$data</span> = curl_exec(<span>$ch</span>); <span>//</span><span>运行curl</span>
curl_close(<span>$ch</span><span>);
</span><span>return</span> <span>$data</span><span>;
}
</span><span>function</span> curl_post_ssl(<span>$url</span>,<span>$vars</span>,<span>$second</span>=30,<span>$aHeader</span>=<span>array</span><span>())
{
</span><span>$ch</span> =<span> curl_init();
</span><span>//</span><span>curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt($ch,CURLOPT_VERBOSE,'1');</span>
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span>$ch</span>,<span>$second</span><span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,1<span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,<span>false</span><span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,CURLOPT_SSLCERTTYPE,'PEM'<span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,CURLOPT_SSLCERT,'/data/cert/<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>.pem'<span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,CURLOPT_SSLCERTPASSWD,'1234'<span>);
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,CURLOPT_SSLKEYTYPE,CURLOPT_SSLKEY,'/data/cert/<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>_private.pem'<span>);
</span><span>if</span>( <span>count</span>(<span>$aHeader</span>) >= 1<span> ){
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,CURLOPT_HTTPHEADER,<span>$aHeader</span><span>);
}
curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span>$ch</span>,<span>$vars</span><span>);
</span><span>$data</span> = curl_exec(<span>$ch</span><span>);
curl_close(</span><span>$ch</span><span>);
</span><span>if</span>(<span>$data</span><span>){
</span><span>return</span> <span>$data</span><span>;
}</span><span>else</span><span>{
</span><span>return</span> <span>false</span><span>;
}
}
}
Alipay.PHP
<span>use<span> think\Validate;
<span>use think\<span>Log<span>;
<span>use<span> think\Model;
<span>use<span> lib\<span>AlipaySubmit;
<span>class Alipay <span>extends<span> Model
{
<span>protected <span>$partner<span>;
<span>protected <span>$md5_key<span>;
</span><span>public</span> <span>function</span> __construct(<span>$partner</span> = "",<span>$md5_key</span> = ""<span>)
{
</span><span>$this</span>->partner = <span>$partner</span><span>;
</span><span>$this</span>->md5_key = <span>$md5_key</span><span>;
}
</span><span>public</span> <span>static</span> <span>$alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span> =<span> [
</span><span>//</span><span> 'partner' => '',//支付宝partner,2088开头数字
// 'seller_id' => '',//支付宝partner,2088开头数字
// 'key' => '',//支付宝密钥</span>
'sign_type' => 'MD5','input_charset' => 'utf-8','cacert' => '','transport' => 'http','payment_type' => '1','service' => '',<span>//</span><span>https://docs.open.alipay.com/api_1 看你需要哪个API接口</span>
'anti_phishing_key' => '','exter_invoke_ip' => '','app_pay' => 'Y',<span>
];
</span><span>public</span> <span>function</span> alipay(<span>$data</span> =<span> [])
{</span><span>//</span><span>发起支付宝支付</span>
<span>$validate</span> = <span>new</span><span> Validate([
[</span>'out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no','require|alphaNum','订单编号输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>1|订单编号输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>2'],<span>
[</span>'total_fee','require|number|gt:0','金额输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>|金额输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>|金额输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>'],<span>
[</span>'subject','require','请输入<a href="https://www.jb51.cc/tag/biaoti/" target="_blank">标题</a>'],<span>
[</span>'body','请输入描述'],<span>
[</span>'notify_url','异步<a href="https://www.jb51.cc/tag/tongzhi/" target="_blank">通知</a>地址不为空'],<span>
]);
</span><span>if</span> (!<span>$validate</span>->check(<span>$data</span><span>)) {
</span><span>return</span> ['code' => 0,'msg' => <span>$validate</span>-><span>getError()];
}
</span><span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span> = self::<span>$alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span><span>;
</span><span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['partner'] = <span>$this</span>-><span>partner;
</span><span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['seller_id'] = <span>$this</span>-><span>partner;
</span><span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['key'] = <span>$this</span>-><span>md5_key;
<a href="https://www.jb51.cc/tag/vend/" target="_blank">vend</a>or(</span>'alipay.alipay'<span>);
</span><span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meter</span> =<span> [
</span>"service" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['service'],"partner" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['partner'],"seller_id" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['seller_id'],"payment_type" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['payment_type'],"notify_url" => <span>$data</span>['notify_url'],"return_url" => <span>$data</span>['return_url'],"anti_phishing_key" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['anti_phishing_key'],"exter_invoke_ip" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['exter_invoke_ip'],"out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no" => <span>$data</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'],"subject" => <span>$data</span>['subject'],"total_fee" => <span>$data</span>['total_fee'],"body" => <span>$data</span>['body'],"_input_charset" => <span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['input_charset'],<span>
];
</span><span>$alipaySubmit</span> = <span>new</span> AlipaySubmit(<span>$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span><span>);
</span><span>return</span> ['code' => 1,'msg' => <span>$alipaySubmit</span>-><a href="https://www.jb51.cc/tag/buildr/" target="_blank">buildr</a>equestForm(<span>$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meter</span>,"get","确认"<span>)];
}
}
?>
wx.html在使用微信客户端支付时需要的页面
Email:361169632@qq.com注明出处:
ThinkPHP 使用微信支付V3
相信大家总是在支付环节出错 ,石头特地送上例子。
1、设置测试目录
在微信公众平台设置,支付测试状态下,设置测试目录,测试人的微信号添加到白名单,发起支付的页面目录必须与设置的精确匹配。并将支付链接发到对应的公众号会话窗口中才能正常发起支付测试。注意正式目录一定不能与测试目录设置成一样,否则支付会出错。
2、设置正式支付目录
根据图中栏目顺序进入修改栏目,勾选JSAPI网页支付开通该权限,并配置好支付授权目录,该目录必须是发起支付的页面的精确目录,子目录下无法正常调用支付。
3,网页账号
首先登录管理后台->点击开发者中心->网页账号,并点击修改
如果网页账号不填写会报redirect_uri参数错误
准备工作做完 然后 然后 然后直接上石头给大家的代码即可
Thinkphp - way.rar
( 1.09 MB 下载:9 次 )
今天的关于thinkphp整合微信支付代码分享和thinkphp对接微信支付的分享已经结束,谢谢您的关注,如果想了解更多关于PHP编程:Thinkphp和onethink实现微信支付插件、ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 使用微信支付V3的相关知识,请在本站进行查询。
本文标签: