# 在线支付
微信支付 (opens new window)是腾讯公司的支付业务品牌,微信支付商户平台支持线下场所、公众号、小程序、PC网站、APP、企业微信等经营场景快速接入微信支付。
# 支付配置
下面通过PC扫码支付来演示微信支付的使用,其他支付方式与此大同小异。
首先需要在微信支付平台 (opens new window)申请帐号,微信提供多款支付产品 (opens new window)用于满足不同应用场景的支付。
产品 | 说明 |
---|---|
JSAPI支付 | 使用微信APP内部浏览器发起支付,适用于微信公众号等场景 |
APP支付 | 在APP中发起支付 |
Native支付 | PC网页生成二维码,用户使用微信扫码支付 |
H5支付 | 手机端浏览器的H5页面中发起支付,会调取用户微信APP完成支付 |
# API证书
访问微信支付帐户中心 (opens new window) 并下载证书工具来生成证书。
每年生成证书有次数限制,所以生成好的证书请妥善保存
执行软件首先设置证书保存目录
设置商户信息(初次执行会自动填写)
按提示操作剩下的步奏,将最终生成的证书妥善保存
# API密钥
需要设置32位API密钥,可以使用随机密码生成器 (opens new window)来生成,并设置到微信支付的API安全 (opens new window)中,并妥善保存以供后面程序中使用。
# 商户号
- 登录微信支付产品中心 (opens new window) 选择支付产品
然后在「开发配置」中查看商户号
# Native支付
Native用于在PC桌面端生成二维码完成支付。
# 绑定服务号
使用 Native支付 (opens new window) 需要首先绑定具有支付功能的微信服务号。请在 AppID帐号管理 (opens new window) 中绑定微信服务号。
# 设置回调地址
在 产品中心 >
开发配置 (opens new window)> 支付配置 > Native支付
中设置 Native支付回调链接
# h5支付
使用h5支付时即在移动端浏览器支付,也需要绑定具有支付功能的微信服务号。
# 配置支付域名
然后访问 产品中心 -> JSAPI支付 -> 开发配置 -> H5支付
配置H5支付域名,注意域名不要加 www
# 程序编码
下面来使用 yansongda/pay (opens new window) 快速为网站集成微信Native支付
。
相比自己完成支持业务来讲,使用扩展包快速便捷。
- 使用的金额单位为 分
# 参数说明
下面对开发中用到的参数进行说明
- mch_id 微信支付商户号 帐户中心>个人信息>帐号信息>登录帐号 (opens new window)
- key 商户支付API密钥 帐户中心>API安全>设置API密钥 (opens new window)
- app_id 公众号应用 ID 产品中心>AppID账号管理 (opens new window)
# 安装扩展
使用 composer 安装扩展包
composer require yansongda/pay -vvv
安装 endroid/qr-code (opens new window)用于生成二维码
composer require endroid/qr-code
# 业务处理
下面是Laravel框架为例编写后台业务代码。创建控制器 App\Http\Controllers\PayController.php
内容如下
- PC扫码支付需要安装 qr-code (opens new window) 扩展来生成二维码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
use Endroid\QrCode\Builder\Builder;
class PayController extends Controller
{
//生成支付二维码
public function pay()
{
$order = [
'out_trade_no' => time(), //定单号
'total_fee' => '0.01'*100, //金额单位分
'body' => 'test subject - 测试', //商品描述
];
$pay = Pay::alipay($this->config())->scan($order);
//生成支付二维码(前台异步请求后再展示为二维码图片)
return Builder::create()->data($pay->code_url)->build()->getDataUri();
}
//微信支付配置
protected function config()
{
return [
"key": "xxxx", //商户支付API密钥
"app_id": "xxx", //公众号AppID
"mch_id": "xxxx", //微信支付商户号
'notify_url' => route('pay.notify'), //异步通知地址
//'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
];
}
//异步通知
public function notify()
{
$pay = Pay::wechat($payService->config());
$data = $pay->verify();
// 订单号:$data->out_trade_no
// 支付宝交易号:$data->trade_no
// 订单总金额:$data->total_amount 单位为分
Log::info($data);
return $alipay->success();
}
}
# 路由配置
下面来配置路由
Route::get('pay','PayController@pay')->name('pay');
Route::post('pay','PayController@notify')->name('pay.notify');
# 沙箱模式
沙箱环境 (opens new window) (Beta) 是微信为降低商户测试门槛,微信支付团队开发了一套独立的仿真测试系统。该系统根据验收用例金额的不同返回不同的响应报文,以满足商户正常功能测试、安全/异常测试及性能测试的需求。
- 沙箱模式不需要手机扫码,会自动完成支付过程
# 理解沙箱
微信支付仿真测试系统(后简称仿真系统)的简化原理图。仿真系统的API协议与正式API完全相同(API接口文档 (opens new window))。商户开发者只需将正式API的调用URL增加一层sandboxnew路径,即可对接到仿真系统。
例如,付款码支付URL:https://api.mch.weixin.qq.com/pay/micropay
变更为:https://api.mch.weixin.qq.com/sandboxnew/pay/micropay
下图是仿真系统的支付流程
仿真系统与生产环境完全独立,包括存储层。商户在仿真系统所做的所有交易(如下单、支付、查询)均为无资金流的假数据,即:用户无需真实扣款,商户也不会有资金入账。
# 验收用例
使用微信支付沙箱模式时不像支付宝可以随意设置金额,微信支付的沙箱模式只能使用固定金额的用例操作。
需要关注「微信支付商户接入验收助手」公众号来查看,请扫描下面二维码进行关注。
# 扩展配置
使用 yansongda/pay (opens new window) 进行支付时,只需要设置配置项 mode='dev' 即可。
protected function config(){
return [
"key": "xxxx", //商户支付API密钥
"app_id": "xxx", //公众号AppID
"mch_id": "xxxx", //微信支付商户号
'notify_url' => route('pay.notify'), //异步通知地址
'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
];
}
微信公众号 →