- 下载微信支付SDK(官方下载路径URL:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)
- 将下载文件进行解压获取文件,文件结构如下图所示
- 找到ThinkPHP3.2.3第三方库中路径为:ThinkPHP\Library\Vendor。在此路径下创建文件夹Weixinpay(名称可以随意),将下载解压后的文件复制新建文件夹中。
- 在模块中创建控制器 WeixinpayController.class.php 用于处理支付,定义方法wxpay()实现支付功能。
-
public function wxpay() { vendor('WeixinPay.example.WxPay#JsApiPay');//引入文件 try{ $tools = new JsApiPay(); $openId = $tools->GetOpenid(); //②、统一下单 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); //商品描述 //$input->SetAttach("test"); //附加数据暂未使用到可以注释掉 $input->SetOut_trade_no("sdkphp".date("YmdHis"));//商户订单号,此处订单号根据实际项目中订单号进行赋值,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一 $input->SetTotal_fee("1"); //订单总金额,单位为分 $input->SetTime_start(date("YmdHis"));//订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010 $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id //$input->SetGoods_tag("test");//订单优惠标记,使用代金券或立减优惠功能时需要的参数,项目暂未使用到,因此注释掉 $input->SetNotify_url("http://paysdk.weixin.qq.com/notify.php");//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 $input->SetTrade_type("JSAPI");//交易类型JSAPI 公众号支付;NATIVE 扫码支付;APP APP支付; $input->SetOpenid($openId); $config = new WxPayConfig(); $order = WxPayApi::unifiedOrder($config, $input); echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>'; $this->printf_info($order); $jsApiParameters = $tools->GetJsApiParameters($order); //获取共享收货地址js函数参数 $editAddress = $tools->GetEditAddressParameters(); //将数据渲染到模板中或前端页面中 $assign=array( 'data'=>$jsApiParameters ); $this->assign($assign); $this->display(); } catch(Exception $e) { Log::ERROR(json_encode($e));//此处因为没有使用微信日志方法,所以暂未引入日志类 } }
- 使用微信数据输出样式进行展示得到的数据:如下
-
public function printf_info($data) { foreach($data as $key=>$value){ echo "<font color='#00ff55;'>$key</font> : ".htmlspecialchars($value, ENT_QUOTES)." <br/>"; } }
-
此时访问wxpay()方法时会出现一堆报错,报错内容大概是一些xxx类不存在或者xxx方法不存在等信息,因为直接使用Vendor引入下载的SDK文件,入口文件是index.php,因此‘..’路径不对,所以需要修改SDK文件引入路径。如下:
-
example/WxPay.JsApiPay.php文件修改如下:
example/WxPay.Config.php文件修改如下:
- 只需将类似这样的路径进行修改如上所示即可
- 配置微信支付所需要的参数,在example/WxPay.Config.php进行配置信息,配置数据获取方式网上搜索一堆,此处不再介绍
- html页面渲染如下:此页面是官方提供的代码样式,此处代码写在和控制器WeixinpayController.class.php一个模块中。使用的是ThinkPHP本身前后端编写方式。
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>微信支付样例-支付</title>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
var data={$data};
WeixinJSBridge.invoke(
'getBrandWCPayRequest', data,
function(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg);
}
);
}
function callpay(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
</script>
<script type="text/javascript">
//获取共享地址
function editAddress()
{
WeixinJSBridge.invoke(
'editAddress',
<?php echo $editAddress; ?>,
function(res){
var value1 = res.proviceFirstStageName;
var value2 = res.addressCitySecondStageName;
var value3 = res.addressCountiesThirdStageName;
var value4 = res.addressDetailInfo;
var tel = res.telNumber;
alert(value1 + value2 + value3 + value4 + ":" + tel);
}
);
}
window.onload = function(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', editAddress, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', editAddress);
document.attachEvent('onWeixinJSBridgeReady', editAddress);
}
}else{
editAddress();
}
};
</script>
</head>
<body>
<br/>
<font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>
<div align="center">
<button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay();" >立即支付</button>
</div>
</body>
</html>
- 此时可以进行测试支付操作,可以进行正常唤起支付弹窗进行支付。
- 支付成功之后进行回调处理
- 在控制器WeixinpayController.class.php中定义notify()方法用于调用回调:如下
- 在example/notify.php文件中进行处理回调逻辑代码:如下
、
- 微信支付到此结束