thinkphp5使用easywechat集成微信扫码支付

1,使用composer在thinkphp5项目的根目录安装easywechat:

composer require endroid/qrcode  安装endroid/qrcode

 
 
  1. $ composer require overtrue/wechat:~3.1 -vvv
     2,安装好之后在控制器中开始使用,示例代码:

① 配置,我这里的相关配置项是放在extra目录的wechat.php,内容如下:

  1. return [
  2. /**
  3. * Debug 模式,bool 值:true/false
  4. *
  5. * 当值为 false 时,所有的日志都不会记录
  6. */
  7. 'debug' => true,
  8. /**
  9. * 账号基本信息,请从微信公众平台/开放平台获取
  10. */
  11. 'app_id' => 'wx851*****5f7e8', // AppID
  12. 'secret' => 'fdb592c******3828fdfd273', // AppSecret
  13. 'token' => 'TOKEN', // Token
  14. 'aes_key' => '', // EncodingAESKey,安全模式下请一定要填写!!!
  15. /**
  16. * 日志配置
  17. *
  18. * level: 日志级别, 可选为:
  19. * debug/info/notice/warning/error/critical/alert/emergency
  20. * permission:日志文件权限(可选),默认为null(若为null值,monolog会取0644)
  21. * file:日志文件位置(绝对路径!!!),要求可写权限
  22. */
  23. 'log' => [
  24. 'level' => 'debug',
  25. 'permission' => 0777,
  26. 'file' => ROOT_PATH . 'runtime/wechat/easywechat.log',
  27. ],
  28. /**
  29. * OAuth 配置
  30. *
  31. * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
  32. * callback:OAuth授权完成后的回调页地址
  33. */
  34. 'oauth' => [
  35. 'scopes' => ['snsapi_userinfo'],
  36. 'callback' => '/examples/oauth_callback.php',
  37. ],
  38. /**
  39. * 微信支付
  40. */
  41. 'payment' => [
  42. 'merchant_id' => '135*****602',
  43. 'key' => '80b8682*****8fdac7784',
  44. 'cert_path' => ROOT_PATH . 'public/certs/wechat/apiclient_cert.pem', // XXX: 绝对路径!!!!
  45. 'key_path' => ROOT_PATH . 'public/certs/wechat/apiclient_key.pem', // XXX: 绝对路径!!!!
  46. 'notify_url' => 'http://*******/notify/wxpay',
  47. ],
  48. /**
  49. * Guzzle 全局设置
  50. *
  51. * 更多请参考: http://docs.guzzlephp.org/en/latest/request-options.html
  52. */
  53. 'guzzle' => [
  54. 'timeout' => 3.0, // 超时时间(秒)
  55. //'verify' => false, // 关掉 SSL 认证(强烈不建议!!!)
  56. ],
  57. ];
扫码支付主要需要的配置是appid 已经payment相关的配置项,配置好之后,在控制器内开始使用:


②控制器代码:


  1. <?php
  2. /**
  3. * FileName:Pay.php
  4. * Author:Graent <[email protected]> at www.diyi01.com
  5. * Copyright:
  6. * CreateTime:2017/10/12 18:43
  7. * Description:
  8. */
  9.  
  10.  
  11. namespace app\payment\controller;
  12.  
  13.  
  14. use EasyWeChat\Foundation\Application;
  15. use EasyWeChat\Payment\Order;
  16. use Endroid\QrCode\QrCode;
  17. use Endroid\QrCode\ErrorCorrectionLevel;
  18.  
  19. class Wxpay extends Prepay
  20. {
  21. public function index(){
  22. //获取微信配置
  23. $wxConf = config('wechat');
  24. //实例化easyWeChat
  25. $wxApp = new Application($wxConf);
  26. //支付订单参数
  27. $attributes = [
  28. 'trade_type' => 'NATIVE', // JSAPI,NATIVE,APP...
  29. 'body' => '这里是body',
  30. 'detail' => '这里是detail,可选',
  31. 'out_trade_no' => '自己生成自己站点的唯一单号',
  32. 'total_fee' => 1 * 100, // 单位:分// 支付结果通知网址,如果不设置则会使用配置里的默认地址
  33. ];
  34. //初始化订单
  35. $order = new Order($attributes);
  36. //实例化支付
  37. $payment = $wxApp->payment;
  38. //预支付
  39. $result = $payment->prepare($order);
  40. if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
  41. $prepayId = $result->prepay_id;
  42. $codeUrl = $result->code_url;
  43. //生成二维码
  44. $Qr = new QrCode($codeUrl);
  45. $Qr->setSize(300)
  46. ->setWriterByName('png')
  47. ->setMargin(10)
  48. ->setEncoding('utf-8')
  49. ->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH)
  50. ->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0])
  51. ->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255])
  52. // ->setLogoPath(ROOT_PATH . 'template/common/images/wxpay.png')
  53. // ->setLogoWidth(65)
  54. ->setValidateResult(false);
  55. $Qr->writeFile(ROOT_PATH . "uploads/qrcode.png");
  56. $imgData= imgToBase64(ROOT_PATH . "uploads/qrcode.png");
  57. return json(['errcode'=>0,'msg'=>'发起支付成功','imgData'=>$imgData]);
  58. }else{
  59. return json(['errcode'=>1,'msg'=>'发起支付失败,稍后再试吧']);
  60. }
  61. }
  62. }

代码中使用的是Endroid生成的二维码,预支付成功之后微信支付服务器返回的是用于生成二维码的内容(code_url),可以自己通过一些类库生成二维码展现给客户扫描就可以了,我这里生成二维码之后转换成了base64返回前端的,也可以不这样,看你自己的需求吧,这样发起支付基本就可以工作了,最后就是回调通知,这一步是必须的,用户支付完成后微信支付服务器会发post请求到商户设置的notify_url通知商户支付状态已经传回诸如商户单号等参数,方便商户操作站点内的订单的状态等:

 
 
  1. <?php
  2. /**
  3. * FileName:Notify.php
  4. * Author:Graent <[email protected]> at www.diyi01.com
  5. * Copyright:
  6. * CreateTime:2017/10/14 13:18
  7. * Description:
  8. */
  9.  
  10.  
  11. namespace app\payment\controller;
  12.  
  13.  
  14. use app\payment\model\MemberFreezingAmount;
  15. use EasyWeChat\Foundation\Application;
  16. use think\Db;
  17.  
  18. class Notify extends Prepay
  19. {
  20. public function notify(){
  21. $payType = input('paytype');
  22. if($payType == 'wxpay'){
  23. //微信支付notify
  24. $wxConf = config('wechat');
  25. $wxApp = new Application($wxConf);
  26. $response = $wxApp->payment->handleNotify(function ($notify,$successful){
  27. if($successful){
  28. $rstArr = json_decode($notify,true);
  29. $ord = (new MemberFreezingAmount())
  30. ->where('trade_no','=',$rstArr['out_trade_no'])
  31. ->find();
  32. if($ord['status'] != 0){
  33. Db::name('member_freezing_amount')
  34. ->where('trade_no','=',$rstArr['out_trade_no'])
  35. ->update([
  36. 'status' => 0,
  37. 'transaction_id' => $rstArr['transaction_id'],
  38. 'pay_time' => time()
  39. ]);
  40. Db::name('mht_goods')
  41. ->where('id','=',$ord['gid'])
  42. ->setInc('bmnum');
  43. }
  44. return true;
  45. }else{
  46. return false;
  47. }
  48. });
  49. return $response;
  50. }else{
  51. //预留处理
  52. return false;
  53. }
  54. }
  55. }
easywechat帮我们封装了回调的处理直接使用即可 $response = $wxApp->payment->handleNotify(function ($notify,$successful){})其中$notify就是微信支付返回的信息,$successful是状态,true即为成功,那么商户就可以进行自己的业务操作了,参考上面的带可以实现基本的处理,如果有更多自己的逻辑自己在对应的位置增加自己的处理即可。

注意,在发起支付的时候很多人遇到过签名错误的问题,一般情况仔细检查下商户的支付key是一下是否一致,一般就可以解决这个问题,好了,另外微信返回的二维码有效期是2个小时,朋友们可以自行处理,微信扫码支付就这么做完了,希望可以给一些朋友提供一些参考。


猜你喜欢

转载自blog.csdn.net/qq_36746815/article/details/79847533