- 下载demo放置在vendor目录下
- 配置好config
- 微信商户平台配置到支付目录(一定是目录,不是方法)
js调起支付方法
//调用微信JS api 支付
function jsApiCall()
{
var item_id = {$payinfo['item_id']};
var data={$data};
WeixinJSBridge.invoke(
'getBrandWCPayRequest', data,
function(res){
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok"){
alert("支付成功!");
window.location.href="";//支付成功,发货处理方法
}else if(res.err_msg == "get_brand_wcpay_request:cancel"){
alert("用户取消支付!");
window.location.href=""; //支付取消处理方法
}else{
alert("支付失败!");
window.location.href="";//支付失败处理方法
}
}
);
}
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();
}
}
PHP支付类
<?php
namespace app\*\controller;
use think\Controller;
use think\Session;
use app\*\model\ConfigCommodityInfo;
use app\*\model\RecordOrder;
class Pay extends Controller
{
public function _initialize()
{
parent::_initialize();
$this->info = new ConfigCommodityInfo();
$this->order = new RecordOrder();
}
//统一下单 调取微信支付接口
public function pay($item_id,$order_sn,$openid)
{
vendor('pay.WxPayApi') ;
vendor('pay.WxPayJsApiPay');
$tools = new \JsApiPay();
$order = new \WxPayApi();
$appid = '*';
$payinfo = $this->info->selCommodityInfoId($item_id);
define("PARTERKEY",$payinfo['item_id']);
$input = new \WxPayUnifiedOrder();
$input->SetBody($payinfo['item_title']); //商品名称
$input->SetAttach('$attach'); //附加参数,可填可不填,填写的话,里边字符串不能出现空格
$input->SetOut_trade_no($order_sn); //订单号
$input->SetTotal_fee($payinfo['unit_price'] *100); //支付金额,单位:分换成元*100
$input->SetTime_start(date("YmdHis", time() )); //支付发起时间
$input->SetTime_expire(date("YmdHis", time() + 6000));//支付超时
$input->SetGoods_tag("test3");
$input->SetNotify_url("/agent/coupon/notify");
$input->SetTrade_type("JSAPI"); //支付类型
$input->SetOpenid($openid); //用户openID
$input->SetAppid($appid);
$order = $order->unifiedOrder($input); //统一下单
$jsApiParameters = $tools->GetJsApiParameters($order);
return $jsApiParameters;
}
public function imstr($field){
$str = '';
foreach ($field as $key) {
$str .= "`v`."."`".$key."`,";
}
return trim($str,',');
}
//微信支付回调验证
public function notify(){
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$data = 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('./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']; //付款金额
//更新数据库
$this->updateDB($order_id,$order_sn,$openid,$total_fee);
}else{
$result = false;
}
// 返回状态给微信服务器
if ($result) {
$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
}else{
$str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
}
echo $str;
return $result;
}
/**
* 生成签名
* @return 签名,本函数不覆盖sign成员变量
*/
protected function makeSign($data){
//获取微信支付秘钥
vendor('pay.WxPayApi') ;
$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;
}
}
//数据库订单生成一级微信订单生成
public function buy_order()
{
$item_id = input('item_id');
$payinfo = $this->info->selCommodityInfoId($item_id);
$payinfo['order_create_time'] = date('Y-m-d H:i:s',time()) ;
$order_sn = time() . rand(1000,9999);
$payinfo['order_id'] = $order_sn;
$openid = Session::get('front_pay_openid');
$res['order_id'] = $order_sn;
$res['goods_id'] = $payinfo['item_id'];
$res['user_id'] = Session::get('user_id');
$res['goods_total_price'] = $payinfo['unit_price'];
$res['order_create_time'] = time().'000';
$this->order->addOrder($res);//数据库生成订单
$this->assign('payinfo',$payinfo);
$data = $this->pay->get_paysign($item_id,$order_sn,$openid);//微信支付订单生成(商品ID,订单号,微信用户openid)
$this->assign('data',$data);
return $this->fetch();
}
微信用户openid获取方法
public function get_openid()
{
vendor('pay.WxPayApi') ;
vendor('pay.WxPayJsApiPay');
if(empty(Session::get('front_pay_openid'))){
$pay = new \JsApiPay();
$openid = $pay->GetOpenid();
Session::set('front_pay_openid',$openid);
}
}