首先从微信官方下载他们的DEMO,注意这个DEMO其实是有问题的,在开发过程中会有问题,后面会讲到。
官方DEMO下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip
在文件包里面我们能用到的文件如下:
lib目录下的:
WxPay.Api.php
WxPay.Config.php
WxPay.Data.php
Wxpay.Exception.php
WxPay.Notify.php(这个文件我没有用来。)
example目录下的:
WxPay.JsApiPay.php
在TP3.1的ThinkPhp->Extend->Vendor下面新建一个Weixinpay的目录。把这些文件COPY到里面。
在复制前,有几个文件的文件名要进行修改:
WxPay.JsApiPay.php文件名改为:WxPayJsApiPay.php
WxPay.Api.php文件名改为:WxPayApi.php
打开WxpayJsApiPay.php文件
将2行:
require_once "../lib/WxPay.Api.php";
改为:require_once "WxPayApi.php";
将99行:curl_setopt($ch, CURLOP_TIMEOUT, 30);
改为:curl_setopt($ch, CURLOPT_TIMEOUT, 30);
这里是微信官方的一个错误,少了一个T!打开:WxPayApi.php文件
将537,538行:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
改为:curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验
这里如果不改,会出现证书校验的错误。好了,到这里文件改的差不多了。
接下去下载证书。
下载cert证书,这个是必需的,要不然会有问题。
在Weixinpay目录里面新建cert目录。
这个证书在:pay.weixin.qq.com 里面下载。帐户设置->api安全里面下载。把下载下来的文件复制到cert目录就可以了。
打开WxPay.Config.php文件,做配置。

好了,一切就绪,开始写Action
新建一个WeixinpaysAction.class.php文件
代码如下:
<?php
Class WeixinpaysAction extends Action{
//在类初始化方法中,引入相关类库
public function _initialize() {
vendor('Weixinpay.WxPayJsApiPay');
}
Public function index(){
//1、获取openid
$tools = new JsApiPay();
$openId = $tools->GetOpenid();
//2、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody("test");
$input->SetAttach("test");
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee("1");
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://test.******.com/index.php/Weixinpays/notify/"); //支付回调地址,这里改成你自己的回调地址。
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$order = WxPayApi::unifiedOrder($input);
$jsApiParameters = $tools->GetJsApiParameters($order);
$this->jsApiParameters=$jsApiParameters;
$this->display();
}
//回调灵
Public function notify(){
//这里没有去做回调的判断,可以参考手机做一个判断。
$xmlObj=simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA']); //解析回调数据
$appid=$xmlObj->appid;//微信appid
$mch_id=$xmlObj->mch_id; //商户号
$nonce_str=$xmlObj->nonce_str;//随机字符串
$sign=$xmlObj->sign;//签名
$result_code=$xmlObj->result_code;//业务结果
$openid=$xmlObj->openid;//用户标识
$is_subscribe=$xmlObj->is_subscribe;//是否关注公众帐号
$trace_type=$xmlObj->trade_type;//交易类型,JSAPI,NATIVE,APP
$bank_type=$xmlObj->bank_type;//付款银行,银行类型采用字符串类型的银行标识。
$total_fee=$xmlObj->total_fee;//订单总金额,单位为分
$fee_type=$xmlObj->fee_type;//货币类型,符合ISO4217的标准三位字母代码,默认为人民币:CNY。
$transaction_id=$xmlObj->transaction_id;//微信支付订单号
$out_trade_no=$xmlObj->out_trade_no;//商户订单号
$attach=$xmlObj->attach;//商家数据包,原样返回
$time_end=$xmlObj->time_end;//支付完成时间
$cash_fee=$xmlObj->cash_fee;
$return_code=$xmlObj->return_code;
//下面开始你可以把回调的数据存入数据库,或者和你的支付前生成的订单进行对应了。
//需要记住一点,就是最后在输出一个success.要不然微信会一直发送回调包的,只有需出了succcess微信才确认已接收到信息不会再发包.
}
}
下面我是微信支付的页面index.html,代码如下:<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()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
{$jsApiParameters},
function(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg); //这里是信息提示。可以加判断做跳转,支付成功后也都会回到这里提示信息。具体你可以参考手册里面的信息。
}
);
}
function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
alert('nul');
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
</script>
</head>
<body>
<br/>
<font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>
<div align="center">
<button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
</div>
</body>
</html>
以上页面代码基本就是微信给出的demo里面的代码。只不过把地址获取这一块给去掉了,因为我的应用不需要地址。还有一部很关键的就是你在微信设置

在这里设置支付授权目录,授权目录要设到最后一级
如:http://test.baidu.com/index.php/Weixinpay/index/
如果这个目录设置错误,会提示appid错误的。
到这里,微信JSAPI支付基本就搞定了。
在学习thinkphp开发的过程中得到了很多朋友的帮助,所以这次自己研究出来这东西,想来想去还是放上来给大家共享。
第一次写教程,写的不是很详细,请各位见谅,如果有什么问题可以到下面我公布的QQ群里面问。我在群里面的名字是:小明
希望大家共同成长!
我们的微信开发群:422579975,代码稍后整理好会放到群文件。
最佳答案
