简介
Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。
#应用场景
Native支付适用于PC网站、实体店单品或订单、媒体广告支付等场景
用户扫描商户展示在各种场景的二维码进行支付,具体操作流程如下:
步骤一 商户根据微信支付的规则,为不同商品生成不同的二维码(如图3.1),展示在各种场景,用于用户扫描购买。
步骤二 用户使用微信“扫一扫”(如图3.2)扫描二维码后,获取商品支付信息,引导用户完成支付(如图3.3)。
图3.1 支付二维码 | 图3.2 打开微信扫一扫二维码 | 图3.3 确认支付页面 |
步骤三 用户确认支付,输入支付密码(如图3.4)。
步骤四 支付完成后会提示用户支付成功(如图3.5),商户后台得到支付成功的通知,然后进行发货处理。
图3.4 用户确认支付,输入密码 | 图3.5 支付成功提示 |
php代码实现:
1》前端显示支付二维码PC端 仅支持扫码支付 不支持长按二维码完成支付
微信sdk采用的easywechat
composer require w7corp/easywechat
//显示支付二维码 支持pc端 或者线下扫码
public function test(Request $request){
$config = [
// 必要配置
'app_id' => 'xxxxx',
'mch_id' => 'xxxxxx',
'key' => 'A1b2C3d4E5f6G7h8I9j0KlMnOpQrStUv', // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => '/pay_cert/apiclient_cert.pem', // XXX: 绝对路径!!!!
'key_path' => '/pay_cert/apiclient_key.pem', // XXX: 绝对路径!!!!
'notify_url' => 'xxxxxxx/open/wx/pay/callback', // 你也可以在下单时单独设置来想覆盖它
];
$app = Factory::payment($config);
$content = $app->scheme("123");
$img = QrCode::format('png')->size(200)->generate($content);
$qr_code = 'data:image/png;base64,' . base64_encode($img);
echo '<img src="'.$qr_code.'">';exit;
}
2》回调接口
public function payCallback(Request $request){
Log::info(json_encode($request->all()));
$config = [
// 必要配置
'app_id' => 'xxxxx',
'mch_id' => 'xxxxx',
'key' => 'xxxxx', // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => '/pay_cert/apiclient_cert.pem', // XXX: 绝对路径!!!!
'key_path' => '/pay_cert/apiclient_key.pem', // XXX: 绝对路径!!!!
'notify_url' => 'xxxxx/open/wx/pay/callback', // 你也可以在下单时单独设置来想覆盖它
];
$app = Factory::payment($config);
$response = $app->handleScannedNotify(function ($message, $fail, $alert) use ($app) {
Log::info(json_encode($message));
Log::info(json_encode($fail));
Log::info(json_encode($alert));
// 如:$alert('商品已售空');
// 如业务流程正常,则要调用“统一下单”接口,并返回 prepay_id 字符串,代码如下
$result = $app->order->unify([
'out_trade_no' => 'kefu20240911'.rand(1,99999),
'trade_type' => 'NATIVE',
'total_fee' => 1,
'body' => '客服咨询支持',
// 'product_id' => $message['product_id'] ?? 123, // $message['product_id'] 则为生成二维码时的产品 ID
// ...
]);
Log::info(json_encode($result));
return $result['prepay_id'];
});
$response->send();
return "ok";
}
相关请求和接收参数日志:
[2024-09-11 17:16:21] : callBack:request 参数:{"_url":"\/open\/wx\/callBack","signature":"468d8b3be71ac6ecdae1c3877329eeee6bd321ed","timestamp":"1726046181","nonce":"1322485648",
"openid":"otzk36fXsQ1tVNQ83ulCISk5hVww"}
[2024-09-11 17:16:21] : {"ToUserName":"gh_c99244526f10","FromUserName":"otzk36fXsQ1tVNQ83ulCISk5hVww","CreateTime":"1726046181","MsgType":"event","Event":"LOCATION",
"Latitude":"22.537125","Longitude":"114.024910","Precision":"24.191069"}
[2024-09-11 17:26:19] : {"_url":"\/open\/wx\/pay\/callback"}
[2024-09-11 17:26:20] : {"appid":"wx82dd5de1c159bb98","openid":"otzk36QMuBbysDM_e8geEY8eAsyw","mch_id":"1685067562","is_subscribe":"N","nonce_str":"nVGs3p9pR4AZ2QAm",
"product_id":"123","sign":"63F0A0395256563DDCE1EE4657AF4646"}
[2024-09-11 17:26:20] : [{},"fail"]
[2024-09-11 17:26:20] : [{},"alert"]
[2024-09-11 17:26:20] : {"return_code":"SUCCESS","return_msg":"OK","result_code":"SUCCESS","mch_id":"1685067562","appid":"wx82dd5de1c159bb98","nonce_str":"ZJLmxMII4lUdQSpg",
"sign":"630839B7E44D8657DF0435D116BA8198",
"prepay_id":"wx111726202439445ff081d1555036cf0000","trade_type":"NATIVE","code_url":"weixin:\/\/wxpay\/bizpayurl?pr=SEnksOyz1"}