基于laravel框架开发微信支付即服务功能,查询和分配服务人员
一、产品介绍
服务人员,是商家为用户提供服务和转化生意的重要一环。通过支付即服务,商家可在支付完成后为用户推送专属服务人员名片,方便用户快速添加专属服务人员为好友,将线下短时服务转化为线上持续服务,弱联系变为强连接,提升用户体验和商家运营效率。
二、代码实现
1、路由
//查询服务人员
Route::any('queryGuides','GuideController@queryGuides');
//分配服务人员
Route::any('smartGuide','GuideController@smartGuide');
2、实现接口
<?php
namespace App\Http\Controllers\Api\V1;
class GuideController extends BaseController
{
//微信支付分配的商户号
private $yfm_mchId = 1595122901;
//商户API证书序列号serial_no,用于声明所使用的证书
private $serial_no = '5ACC8B75CB448925171BF4F6AD1D12A890BD736F';
//门店ID
$store_id = 20915636;
//查询服务人员id
public function queryGuides()
{
$url = 'https://api.mch.weixin.qq.com/v3/smartguide/guides?store_id='.$this->store_id;
$mchid = $this->yfm_mchId;
$serial_no = $this->serial_no;
//微信支付商户API v3要求请求通过HTTP Authorization头来传递签名。 Authorization由认证类型和签名信息两个部分组成
$headers = $this->createHeader($url , 'GET',$mchid,$serial_no);
$res = $this->http_request($url,$params = null,$headers);
return $res;
}
//为订单分配服务人员(即智能向导)
public function smartGuide()
{
$sn = 'PT20200813164609dd12d4e1';
//服务人员ID
$guide_id = '01008370080000000001';
// $url = 'https://api.mch.weixin.qq.com/v3/smartguide/guides/{guide_id}/assign';
$url = 'https://api.mch.weixin.qq.com/v3/smartguide/guides/'.$guide_id.'/assign';
$params = [
// 'guide_id' => '01008370080000000001',//此参数通过url传递,不通过json传递
'out_trade_no' => $sn
];
$mchid = $this->yfm_mchId;
$serial_no = $this->serial_no;
$params = json_encode($params,true);
$headers = $this->createHeader($url , 'POST',$mchid,$serial_no,$params);
$res = $this->http_request($url,$params,$headers);
return $res;
}
//微信支付商户API v3要求请求通过HTTP Authorization头来传递签名。 Authorization由认证类型和签名信息两个部分组成
public function createHeader($url,$http_method,$merchant_id ,$serial_no,$body = '')
{
$timestamp = time();
$nonce = $this->randomkeys(32);
//支付证书位置
$mch_private_key = base_path() . "/wxpay/apiclient_key.pem";
$mch_private_key = file_get_contents($mch_private_key);
$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
$message = $http_method."\n".
$canonical_url."\n".
$timestamp."\n".
$nonce."\n".
$body."\n";
openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
$schema = 'WECHATPAY2-SHA256-RSA2048';
$token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
$merchant_id, $nonce, $timestamp, $serial_no, $sign);
$header = [
'Content-Type:application/json',
'Accept:application/json',
'User-Agent:*/*',
'Authorization: '. $schema . ' ' . $token
];
return $header;
}
//生成随机字符串
public function randomkeys($length)
{
$pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
$key = '';
for($i=0;$i<$length;$i++)
{
$key .= $pattern{mt_rand(0,35)};
}
return $key;
}
/**
* 调用接口, $data是数组参数
* @return 签名
*/
public function http_request($url,$data = null,$headers=array())
{
$curl = curl_init();
if( count($headers) >= 1 ){
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}