简介
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] prod.INFO: callBack:request 参数:{"_url":"\/open\/wx\/callBack","signature":"xxxxx","timestamp":"1726046181","nonce":"1322485648",
"openid":"otzk36fXsQ1tVNQ83ulCISk5hVww"} [2024-09-11 17:16:21] prod.INFO: {"ToUserName":"xxx","FromUserName":"xxx","CreateTime":"1726046181","MsgType":"event","Event":"LOCATION",
"Latitude":"22.537125","Longitude":"114.024910","Precision":"24.191069"} [2024-09-11 17:26:19] prod.INFO: {"_url":"\/open\/wx\/pay\/callback"} [2024-09-11 17:26:20] prod.INFO: {"appid":"xxxxxx","openid":"xxxxxx","mch_id":"xxxxxx","is_subscribe":"N","nonce_str":"xxx",
"product_id":"123","sign":"63F0A0395256563DDCE1EE4657AF4646"} [2024-09-11 17:26:20] prod.INFO: [{},"fail"] [2024-09-11 17:26:20] prod.INFO: [{},"alert"] [2024-09-11 17:26:20] prod.INFO: {"return_code":"SUCCESS","return_msg":"OK","result_code":"SUCCESS","mch_id":"xxxxx","appid":"xxxxx","nonce_str":"ZJLmxMII4lUdQSpg",
"sign":"xx",
"prepay_id":"xx","trade_type":"NATIVE","code_url":"weixin:\/\/wxpay\/bizpayurl?pr=SEnksOyz1"}
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/18408610