本人小白,刚接触thinkphp,做了一个微信公众号,重点是前后端分离的,带支付的内种,官方给的接口文档好麻烦,问了好多人终于做出来的,还有一件事,为什么这个东西上传不了文件,我一上传就把我之前的写的全变没了,烦,下面给你们代码
<?php
/**
* 订单
* Created by 谁写的我也不知道,反正下面是我改的
* User: Hcz
* Date: 2018/7/25
* Time: 19:06
*/
namespace app\index\controller;
use app\index\controller\Base;
use think\Controller;
use think\Db;
use think\Loader;
use think\Cookie;
use think\Config;
use app\index\model\User;
class Wxpeng extends Controller{
//下单
//支付
/**
* @param string $order_no 订单号
* @param string $total 支付金额
你写个订单表,订单表里要有价格,购买人的id,以及订单id和时间,,把订单表的订单号传进来
叫做order_no,用order_no去查找其他信息,我的
订单表叫vip_viporder 用户id叫uid 价格我是另外查询的,你可以自己在订单表里拿
*/
public function pay(){
$order_no=input('order_no');
Loader::import('wxpay.lib.WxPayApi', VENDOR_PATH);
Loader::import('wxpay.example.WxPayJsApiPay', VENDOR_PATH);
//$openid = $orderinfo['openid'];
$res=Db::table('xc_viporder')->where('order_id',$order_no)->find();
$openid=$res['uid'];
$vip=$res['vip'];
$pric=Db::table('xc_huiyuan')->where('vid',$vip)->find();
//准备数据
$tools = new \JsApiPay();
//②、统一下单
$input = new \WxPayUnifiedOrder();
//$input->SetBody('购买'.$ordergoodinfo['goods_name']);
$input->SetBody('购买'.'会员卡');
$input->SetOut_trade_no($order_no);
//价格
$input->SetTotal_fee($pric['money']*100);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
//自己的
$input->SetNotify_url("http://yfj.sharexwd.top/Index/Wxpeng/asynNotify");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);
$order = \WxPayApi::unifiedOrder($input);
$jsApiParameters = $tools->GetJsApiParameters($order);
$this->assign('jsApiParameters',$jsApiParameters);
return $this->fetch();
}
//支付异步回调
public function asynNotify() {
$result = file_get_contents('php://input', 'r');
$result = (array)simplexml_load_string($result, null, LIBXML_NOCDATA);
//$result=input();
$num=rand(10000,99999);
file_put_contents('alipctest_aa'.$num.'.log', print_r($result,true).PHP_EOL,FILE_APPEND);
Loader::import('wxpay.example.WxPayJsApiPay', VENDOR_PATH);
$wxpay = new \JsApiPay();
$orders_no = $result['out_trade_no'];
//这重点重点
上面ordersno是订单号,在这里就意味着你已经支付成功了
在这里写上自己的操作,就比如让扎个订单发货或者更改订单表的状态,就看你自己了
$config = Config::get('wechat');
//验证参数
(($result['result_code'] !== 'SUCCESS') || ($result['mch_id'] !== $config['mch_id']) || ($result['appid'] !== $config['appid'])) && $this->wechatResult('FAIL', 'invalid param');
//验证签名
$this->createSign($result, $config['key']) !== $result['sign'] && $this->wechatResult('FAIL', 'invalid sign');
//修改状态
$this->wechatResult('SUCCESS', 'OK');
}
/**
* 生成签名
* @author Steed
* @param array $data
* @param $key
* @return string
*/
function createSign($data = [], $key) {
unset($data['sign']);
//按ASCII字典序排序
ksort($data);
$str = '';
foreach ($data as $k => $val) {
$str .= $k . '=' . $val . '&';
}
$str .= 'key=' . $key;
return strtoupper(md5($str));
}
//微信回调格式化信息输出
function wechatResult($code, $msg)
{
$xml = '<xml>';
$xml .= '<return_code><![CDATA[' . $code . ']]></return_code>';
$xml .= '<return_msg><![CDATA[' . $msg . ']]></return_msg>';
$xml .= '</xml>';
echo $xml;
die;
}
}
重点
上面的代码放在app\index\controller里,作为控制器,但你会发现她调不起来输入密码页面,诶当时就卡在这了
你把下面代码放在对应的view下,就比如上面文件我叫wxpay,我就在app\index\view\wxpay\index.html
下面是html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
callpay();
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke('getBrandWCPayRequest', {$jsApiParameters},
function(res){
//这里换成你自己的dist文件位置
window.location.href = "http://yfj.sharexwd.top/dist";
// if (res.err_msg == 'get_brand_wcpay_request:ok'){
//
// }else {
// 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>
</html>
奉劝大家,微信公众号别用前后端分离,接接口的方式,要做就前段写jquery,给后端,所有数据后端自己做,要不然还有个openid等着你呢