2019-08-05 01:02:59
围观(5129)
记录下之前负责的一个项目写过的微信支付(为了以后需要 方便Copy)
public function index()
{
//支付数据
$data['out_trade_no'] = date('YmdHis') . rand(100, 999);
$data['total_fee'] = 10; //此处的值需要是实际金额 * 100
$data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];
$data['attach'] = '可以附带的信息';
$data['body'] = '产品信息';
$data['appid'] = 'APPID';
$data['mch_id'] = 'MCHID';
$data['nonce_str'] = md5(time() . rand(0, 999));
$data['trade_type'] = 'NATIVE'; //支付方式
$data['notify_url'] = 'https://bubaijun.com/notify_url'; //异步回调地址
$sign = $this->getParam($data);
$dataXML = "<xml>
<appid>".$data['appid']."</appid>
<attach>".$data['attach']."</attach>
<body>".$data['body']."</body>
<mch_id>".$data['mch_id']."</mch_id>
<nonce_str>".$data['nonce_str']."</nonce_str>
<notify_url>".$data['notify_url']."</notify_url>
<out_trade_no>".$data['out_trade_no']."</out_trade_no>
<spbill_create_ip>".$data['spbill_create_ip']."</spbill_create_ip>
<total_fee>".$data['total_fee']."</total_fee>
<trade_type>".$data['trade_type']."</trade_type>
<sign>".$sign."</sign>
</xml>";
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
//发起HTTP请求 因为用的是 Laravel 框架,所以可以使用GuzzleHttp类
$http = new GuzzleHttp\Client;
$response = $http->request('POST', $url, ['body' => $dataXML]);
$pay_res = $this->xmlToArray($response->getBody());
if($pay_res['return_code'] == 'SUCCESS' && $pay_res['return_msg'] == 'OK') {
//调起支付并成功返回数据
//进行需要的业务逻辑
//然后可以将 code_url 返回给视图并生成二维码
//因为使用的支付方式是 NATIVE 所以将返回的 code_url 生成二维码后使用微信客户端扫码即可支付
} else {
//调起支付失败
//返回失败信息
}
}
private function getParam($paramArray, $isencode = false)
{
$paramStr = '';
ksort($paramArray);
$i = 0;
foreach($paramArray as $key => $value){
if ($key == 'Signature'){
continue;
}
if ($i == 0){
$paramStr .= '';
}else{
$paramStr .= '&';
}
$paramStr .= $key . '=' . ($isencode ? urlencode($value) : $value);
++$i;
}
$key = '微信支付密钥 key';
$stringSignTemp = $paramStr."&key={$key}";
$sign = strtoupper(md5($stringSignTemp));
return $sign;
}
private function xmlToArray($xml)
{
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}
//支付异步回调,使用时记得给该方法写一条路由
public function notify(Request $request)
{
//微信支付结果
$data_xml = $request->getContent();
if(!$data_xml){
return response()->json([
'status' => 400,
'msg' => '请勿进行非法操作'
]);
}
$data = $this->xmlToArray($data_xml);
if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS'){
if($this->checksign($data)) {
//订单号
$out_trade_no = $data['out_trade_no'];
//金额 需要除以100 才能拿到实际付款金额
$price = $data['total_fee'] / 100;
//继续业务逻辑...
}else{
Log::info('微信支付返回结果签名验证失败:', $data);
}
}else{
Log::info('微信支付错误:', $data);
}
}
private function checksign(array $data)
{
$str = '';
ksort($data);
foreach($data as $key => $val) {
if($key != 'sign') $str .= $key.'='.$val.'&';
}
$key = '微信支付密钥 key';
$temp = $str . "key={$key}";
$sign = strtoupper(md5($temp));
return $sign == $data['sign'] ? true : false;
}当然 以上代码和实际项目中是有出入的,只是记录下来为了以后更好Copy,在实际项目中需要根据需求继续完善并写入业务逻辑。
本文地址 : bubaijun.com/page.php?id=129
版权声明 : 未经允许禁止转载!
上一篇文章: Laravel引入支付宝支付SDK
下一篇文章: 开源PHP轮询即时聊天