翼度科技»论坛 编程开发 PHP 查看内容

vue+laravel使用微信Natvite支付

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
Navite支付介绍

Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。适用于PC网站、实体店单品或订单、媒体广告支付等场景
1.先阅读微信支付接入前的准备文档 文档连接:Native支付接入前准备
2.php下载插件 composer require wechatpay/wechatpay
3.需要把证书文件下载下来用于签名验证。下载的签名文件有例如

4.需要用到的参数配置到env环境变量中 如下

5.代码实现
获取支付二维码链接
  1. /**
  2.      * 微信二维码预支付
  3.      * @param string $total 价格
  4.      * @param string $outTradeNo 商户订单号
  5.      * @param int $duration 二维码有效时长 单位:秒
  6.      * @return array 返回二维码链接
  7.      */
  8.     public static function wxNativePrePay(string $total, string $outTradeNo, $duration = 180)
  9.     {
  10.         try {
  11.             $config = Common::get_platform_payInfo();
  12.             $time = \time();
  13.             $time_expire = $time + $duration;
  14.             $rfc3339_time = date(DATE_RFC3339, $time_expire);
  15.             $total = intval(bcmul($total, 100));
  16.             $payInfo = [
  17.                 'out_trade_no' => $outTradeNo,
  18.                 'appid' => $config['appId'],
  19.                 'description' => '支付维修费用',
  20.                 'total' => $total,
  21.                 'time_expire' => (string)$rfc3339_time,
  22.             ];
  23.             $instance = Common::wxPayObj();
  24.             $resp = $instance
  25.                 ->chain('v3/pay/transactions/native')
  26.                 ->post(['json' => [
  27.                     'mchid' => $config['merchantId'],
  28.                     'out_trade_no' => $payInfo['out_trade_no'],
  29.                     'time_expire' => $payInfo['time_expire'],
  30.                     'appid' => $config['appId'],
  31.                     'description' => $payInfo['description'],
  32.                     'notify_url' => $config['notify_url'],
  33.                     'amount' => [
  34.                         'total' => $payInfo['total'],
  35.                         'currency' => 'CNY'
  36.                     ],
  37.                 ]]);
  38.             $data = [];
  39.             $data['code'] = (int)$resp->getStatusCode();
  40.             $data['body'] = $resp->getBody();
  41.             return $data;
  42.         } catch (\Exception $exception) {
  43.             if ($exception instanceof RequestException && $exception->hasResponse()) {
  44.                 $message = "错误回复:" + $exception->getResponse() + "错误码:" + $exception->getResponse()->getStatusCode();
  45.                 +"错误原因" + $exception->getResponse()->getReasonPhrase();
  46.                 Log::info($message);
  47.             }
  48.             return [];
  49.         }
  50.     }
复制代码
common使用的方法
  1. public static function  get_platform_payInfo() {
  2.         $data['merchantPrivateKeyFilePath'] = env('MERCHANT_FILE_PATH');
  3.         $data['platformCertificateFilePath'] = env('PLATFORM_FILE_PATH');
  4.         $data['merchantId'] = env('WX_MERCHANT_ID');
  5.         $data['merchantCertificateSerial'] = env('CERTIFICATE_SERIAL');
  6.         $data['appId'] = env('WX_APP_ID');
  7.         $data['appSecret'] = env('WX_APP_SECRET');
  8.         $data['notify_url'] = env('WX_NOTIFY_URL');
  9.         $data['api_key'] = env('WX_API_KEY');
  10.         return $data;
  11.     }
  12.     public static function wxPayObj()
  13.     {
  14.         try {
  15.            $payInfo = self::get_platform_payInfo();
  16.             // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
  17.             $merchantPrivateKeyInstance = Rsa::from($payInfo['merchantPrivateKeyFilePath'], Rsa::KEY_TYPE_PRIVATE);
  18.             // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
  19.             $platformPublicKeyInstance = Rsa::from($payInfo['platformCertificateFilePath'], Rsa::KEY_TYPE_PUBLIC);
  20.             // 从「微信支付平台证书」中获取「证书序列号」
  21.             $platformCertificateSerial = PemUtil::parseCertificateSerialNo($payInfo['platformCertificateFilePath']);
  22.             // 构造一个 APIv3 客户端实例
  23.             $instance = Builder::factory([
  24.                 'mchid'      => $payInfo['merchantId'],
  25.                 'serial'     => $payInfo['merchantCertificateSerial'],
  26.                 'privateKey' => $merchantPrivateKeyInstance,
  27.                 'certs'      => [
  28.                     $platformCertificateSerial => $platformPublicKeyInstance,
  29.                 ],
  30.             ]);
  31.             return $instance;
  32.         } catch (\Exception $e) {
  33.             Log::info("返回微信支付对象失败", $e);
  34.             return false;
  35.         }
  36.     }
复制代码
前端vue DEMO

需要用的的插件 qrcode
点击查看代码
  1. <template>
  2.   
  3.     <el-button type="primary" @click="toWxPrePay">支付</el-button>
  4.     <el-dialog title="支付" :visible.sync="payVisible" width="30%">
  5.       
  6.         <canvas id="canvas" ref="qrcodeCanvas" ></canvas>
  7.         请使用微信支付
  8.       
  9.     </el-dialog>
  10.   
  11. </template>
复制代码
来源:https://www.cnblogs.com/spinachead/p/18568273
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具