微信支付之JSAPI WxpayAPI_v3
我们很多时候有客户需要开发微信支付,开发了很多次了 但是一直没时间记录分享,为了减少爬坑,也让自己下次更好的拿来使用,我在这先他享一下我的方法
这里要注意一下支付授权目录,使用TP很多人都使用的是重写模式(REWRITE模式)或者在使用REWRITE模式的同时,使用伪静态模式,这时候生成的链接为:[http://serverName/Home/Blog/read/id/1];如果使用的是PATHINFO模式的话,生成的链接就是:[http://serverName/index.php/Home/Blog/read/id/1],比如在Home模块下的Blog控制器中的某个方法进行支付,我们支付的授权目录应该是[http://serverName/Home/Blog/]或者[http://serverName/index.php/Home/Blog/],这个根据自己的TP的设置的URL模式而定。
首先先把微信支付SDK文件拷至/ThinkPHP/Library/Vendor/WxPayPubHelper/ 内如下图
这里的文件我自己经过修改过,需要的朋友可以打开此链接下载
https://pan.baidu.com/s/1geG6qTd

配置文件添加微信配置信息:config.php

接着新建控制器 :WxpayController.class.php
代码如下:
<?php
namespace Home\Controller;
use Think\Controller;
//微信支付类
class WxpayController extends Controller {
//获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
public function js_api_start(){
if(!empty($_GET['order_key_num'])){
// session(array('pay_now_id'=>$_GET['order_key_num'],'expire'=>3600));
S('pay_now_id',$_GET['order_key_num'],3600);
}
vendor('WxPayPubHelper.WxPayPubHelper');
vendor('WxPayPubHelper.WxPayJsApiPay');
vendor('WxPayPubHelper.log');
//①、获取用户openid
$tools = new \JsApiPay();
$openId = $tools->GetOpenid(C('WX_APPID'),C('WX_APPSECRET'));
$data = session('date');
$data1 = session('data1');
if($data){
$id = $data['balanceid'];
$order = M('balance')->where(array('bpid'=>$id))->find();
if($order['remarks'] == '充值成功(微信支付)'){
$this->error('当前订单已经支付');
}
}else{
$this->error("不存在当前订单编号!");
}
$res = array(
'order_sn' => $order['bpno'],
'order_amount' => $order['bpprice']
);
$price = $order['bpprice'] * 100;
//②、统一下单
$input = new \WxPayUnifiedOrder();
$input->SetBody("帐户充值"); //商品名称
$input->SetAttach("充值"); //附加参数,可填可不填,填写的话,里边字符串不能出现空格
$input->SetOut_trade_no($res['order_sn']); //订单号
//$input->SetTotal_fee($price); //支付金额
$input->SetTotal_fee($price); //支付金额,单位:分
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 1200));
$input->SetGoods_tag("帐户充值");
$input->SetNotify_url(C('NOTIFY_URL')); //支付回调验证地址
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$order = \WxPayApi::unifiedOrder(C('WX_APPID'),C('WX_MCHID'),C('NOTIFY_URL'),$input);
/*echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
printf_info($order);*/
$jsApiParameters = $tools->GetJsApiParameters($order);
//获取共享收货地址js函数参数
$editAddress = $tools->GetEditAddressParameters();
$this->assign('jsApiParameters',$jsApiParameters);
$this->assign('editAddress',$editAddress);
$this->assign('openid',$openId);
$this->assign('res',$res);
$this->display('jsapi');
}
//异步通知url,商户根据实际开发过程设定
//
//微信支付回调验证
public function notify_url(){
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
// 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了
file_put_contents('./Api/wxpay/logs/log.txt',$xml,FILE_APPEND);
addlog('log.txt',a,$xml);
//将服务器返回的XML数据转化为数组
//$data = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);
$data = $this->xmlToArray($xml);
// 保存微信服务器返回的签名sign
$data_sign = $data['sign'];
// sign不参与签名算法
unset($data['sign']);
$sign = $this->makeSign($data);
// 判断签名是否正确 判断支付状态
if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) {
$result = $data;
// 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了
file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND);
//获取服务器返回的数据
$order_sn = $data['out_trade_no']; //订单单号
$order_id = $data['attach']; //附加参数,选择传递订单ID
$openid = $data['openid']; //付款人openID
$total_fee = $data['total_fee']/100; //付款金额
//更新数据库
// 更改订单状态
$bpno = $order_sn;
// 先查询订单是否充值成功
$order = M('balance')->where(array('bpno'=>$bpno,'remarks'=>'充值成功(微信支付)'))->find();
if (!$order) {
M('balance')->where(array('bpno'=>$bpno))->save(array('bptime'=>time(),'remarks'=>'充值成功(微信支付)'));
//增加用户付款金额
//先查询付款用户
$uid = M('userinfo')->where(array('openid'=>$openid))->getField('uid');
//增加余额
M('accountinfo')->where(array('uid'=>$uid))->setInc('balance',$total_fee);
}
}else{
$result = false;
}
// 返回状态给微信服务器
if ($result) {
//$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
$str = "SUCCESS";
}else{
//$str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
$str = "FAIL";
}
echo $str;
return $result;
}
/**
* 生成签名
* @return 签名,本函数不覆盖sign成员变量
*/
protected function makeSign($data){
//获取微信支付秘钥
vendor('WxPayPubHelper.WxPayJsApiPay');
$key = \WxPayConfig::KEY;
// 去空
$data=array_filter($data);
//签名步骤一:按字典序排序参数
ksort($data);
$string_a=http_build_query($data);
$string_a=urldecode($string_a);
//签名步骤二:在string后加入KEY
//$config=$this->config;
$string_sign_temp=$string_a."&key=".$key;
//签名步骤三:MD5加密
$sign = md5($string_sign_temp);
// 签名步骤四:所有字符转为大写
$result=strtoupper($sign);
return $result;
}
//将XML转为array
protected function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
}

浙公网安备 33010602011771号