接上一篇tp5.1微信支付开发系列(一)
签名类
调用微信支付api的签名使用较多,因此单独封装了一个类来处理请求参数加密。
<?php
/**
* Created by PhpStorm.
* User: flyits
* Date: 2018/12/29
* Time: 10:07
*/
namespace app\credit\controller\v1\pay;
class Sign
{
/**
* 获取数组
* @param $arr array 请求参数
* @param $sign string 此处为签名字段下标,
* 大部分微信api使用的是sign,
* 但JSAPI前端调用时下标为paySign,故有此参数
* @return array
*/
public static function set_array(&$arr,$sign = 'sign')
{
$arr[$sign] = (new self)->set_sign($arr);
return $arr;
}
//生成加密签名
private function set_sign($object)
{
//签名步骤一:按字典序排序参数
ksort($object);
$string = self::ToUrlParams($object);
//签名步骤二:在string后加入KEY
$string = $string . "&key=" . config('pay.key');
// return $string;
//签名步骤三:md5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
//拼接字符串以加密
public static function ToUrlParams($object)
{
$buff = "";
foreach ($object as $k => $v) {
if ($k != "sign" && $v != "" && !is_array($v)) {
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
}
支付类
注意设置构造参数里的回调地址以及其他参数,配合基类来看。
order方法对应的路由便是给前端暴露的接口,前端访问时会自动判断是pc端还是手机端(微信内还是微信外)自动调用响应支付接口。
<?php
/**
* Created by PhpStorm.
* User: flyits
* Date: 2018/12/25
* Time: 15:50
*/
namespace app\credit\controller\v1\pay;
use app\credit\model\Order;
use app\credit\model\User;
use app\lib\exception\ParameterException;
use think\Exception;
class Pay extends BasePay
{
protected $data = array();
protected $url = '';
public function __construct()
{
parent::__construct();
$this->url = config('pay.url.order');
//商品描述
$this->data['body'] = input('describe', '信用查询');
//商品交易订单号,值唯一
$this->data['out_trade_no'] = 'bx' . get_rand_char(17, 'alpha') . time();
//当前商品价格,以分为单位
$this->data['total_fee'] = input('price', 1) * 100;
//异步接收微信支付结果通知的回调地址
$this->data['notify_url'] = '';
$this->setValue($this->data);
}
/**
* 统一一下单接口
* @author flyits
* @time 2018/12/29 11:58
* @throws
* @return mixed
*/
public function order()
{
$status = \app\credit\service\Order::checkStatus();
if ($status) {
return $status;
}
//基类判断的调用来源,以便调用对应的支付方式
switch ($this->getTradeType()) {
case 'JSAPI':
{
//检测是否分享,此处为我的业务处理判断是否免费,正常直接调用$this->JSAPI()即可
if (input('share') == 'share') {
$this->setValue(['trade_type' => 'SHARE']);