微信公众号支付
微信下载的sdk包appid和secret...配置项是放在了配置文件里。但在实际运用中你要用到多个账户进行测试,每次都要对配置文件进行更改。为了避免多人使用冲突的实现在这里对微信官方给的sdk中的统一下单&&获取openid进行了更改,可重复调取使用。
更改后skd github存放地址( https://github.com/linhue/wxpayment )
使用方法 引入Wxpayments.php服务类文件:
<?php
namespace app\admin\controller;
use think\Controller;
use wxpayment\JsApiPay;
use wxpayment\WxPayments;
class Index extends Controller
{
$WxPayment = new WxPayments();
//第一步 -> 此步骤为配置参数方法必须放在其他操作之前(存储在WxPaymentData对象中) sdk中的WxPayConfig.php丢弃使用由此方法代替设置需要使用的参数
//获取openid只需要设置 app_id && app_secret
//支付需要设置 app_id && mch_id && key
$WxPayment->setPayConfig(['app_id'=>'**','mch_id'=>**,'app_secret'=>'**','key'=>'**']);
//第二步-> 此处为继续使用JsApiPay.php调取三方登陆获取code然后获取openid,内部使用的参数调取的是WxPaymentData对象中参数
$info = (new JsApiPay())->GetOpenid('htttps://www.***.com/admin/index/index');//此处为三方授权登陆回调地址
$openid = $info['openid'];
//第三步 调取微信 统一下单接口 $data所包含
//必选 :: openid(支付用户的openid) notify_url(支付成功通知地址) total_fee(支付金额)
//非必选 :: body(标题) attach(详情) time_start(开始时间) goods_tag trade_type(公众号网页支付默认为 JSAPI)
$order = $WxPayment->payments($data);
//第四步 生成paysign 传给前端调取支付页面。
$paysign = $WxPayment->getPaySign($order);
}
}
(请根据实际情况,合理安排各个步骤)
以下是 WxPayments 服务类容代码。
<?php
namespace wxpayment;
use wxpayment\WxPayApi;
use wxpayment\WxPayUnifiedOrder;
use wxpayment\JsApiPay;
use wxpayment\WxPaymentData;
/**
*支付请求微信下单
*
*微信公众号支付。
* @author linhu<[email protected]>
* @version $Id$
* @since 1.0
*/
final class WxPayments
{
/**
* 生成订单信息
* (JSAPI)所需参数
* 必选 :: openid(支付用户的openid) notify_url(支付成功通知地址) total_fee(支付金额)
* 非必选 :: body(标题) attach(详情) time_start(开始时间) goods_tag trade_type(公众号网页支付默认为 JSAPI)
* return array 统一下单的信息
*(WEB)所需参数
* 必选 :: trade_type=>MWEB
* return prepay_id(*) 微信预支付标识
*
* @access public
* @param array $arr 用户数据
* @return object 返回类型
*/
public function payments($payinfo=[])
{
$input = new WxPayUnifiedOrder();
//设置支付标题
$body = !empty($payinfo['body'])?$payinfo['body']:'test';
$input->SetBody($body);
$attach = !empty($payinfo['attach'])?$payinfo['attach']:'test';
$input->SetAttach($attach);
$input->SetOut_trade_no(WxPaymentData::getMchid().date("YmdHis"));
//设置支付金额 以分为单位 所以此处需要*100
$input->SetTotal_fee($payinfo['total_fee']*100);
//支付发起时间
$time_start = !empty($payinfo['time_start'])?$payinfo['time_start']:date('YmdHis');
$input->SetTime_start($time_start);
$input->SetTime_expire(date("YmdHis", time() + 6000));
//支付发起时间
$goods_tag = !empty($payinfo['goods_tag'])?$payinfo['goods_tag']:'支付';
$input->SetGoods_tag($goods_tag);
//设置支付回调通知url
$notify_url = !empty($payinfo['notify_url'])?$payinfo['notify_url']:'';
$input->SetNotify_url($payinfo['notify_url']);
$trade_type = !empty($payinfo['trade_type'])?$payinfo['trade_type']:'JSAPI';
$input->SetTrade_type($trade_type);
//设置支付用户open_id
$openid = !empty($payinfo['openid'])?$payinfo['openid']:'';
$input->SetOpenid($openid);
// var_dump($input);die;
//请求微信生成订单信息
$order = WxPayApi::unifiedOrder($input);
return $order;
}
/**
* 设置参数 app_id app_secret mch_id
*
* @access public
* @param array $arr 用户数据
* @return array 返回类型
*/
public function setPayConfig( $PayConfig=[])
{
if(!array_key_exists('app_id',$PayConfig) or !array_key_exists('app_secret',$PayConfig) or !array_key_exists('mch_id',$PayConfig)){
return false;
}
$inputObj = new WxPaymentData();
WxPaymentData::setAppid($PayConfig['app_id']);
WxPaymentData::setSecret($PayConfig['app_secret']);
WxPaymentData::setMchid($PayConfig['mch_id']);
WxPaymentData::setMchkey($PayConfig['key']);
return true;
}
/**
* 拼接paysign
*
* @access public
* @param array $arr 用户数据
* @return string 返回类型
*/
public function getPaySign($order=[])
{
return (new JsApiPay())->GetJsApiParameters($order);
}
/**
* 下载今日账单
* bill_date:账单日期格式为: date('Ymd')
* bill_type:(ALL||SUCCESS||REFUND||RECHARGE_REFUND) 默认为ALL
* @access public
* @param array $data
* @return string
*/
public function download( array $data=null){
$inputObj = new WxPaymentData();
// var_dump($inputObj);die;
$inputObj->bill_date = !empty($data['bill_date'])?$data['bill_type']:date('Ymd');
$inputObj->bill_type = !empty($data['bill_type'])?$data['bill_type']:'ALL';
return WxPayApi::downloadBill($inputObj);
}
public function qrBizpayurl(){
return WxPayApi::bizpayurl();
}
/**
* web第三方只方支付
*
* 必选:: prepay_id
* 非必选:: trade_type mweb_url
* 必选-非必选 只限当前方法
* @access public
* @param array $data
* @return jump_web
*/
public function jumpWebUrl($data=[]){
if(!array_key_exists('prepay_id',$data)){
return false;
}
$mweb_url = !empty($data['mweb_url'])?'&mweb_url'.$data['mweb_url']:'';
$trade_type = !empty($data['trade_type'])?'&trade_type='.$data['trade_type']:'&trade_type=MWEB';
$url = 'https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?'.$mweb_url.$trade_type;
Header('location:'.$url);exit;
}
}