Thinkphp整合微信支付功能

论坛 期权论坛 脚本     
niminba   2021-5-23 04:36   2075   0

先上效果图:我要告诉你我这一篇文章写的是微信支付之中的(普通商户而非服务商商户的统一下单JSPI)微信支付:

其实自己整合SDK失败了,用了一个博客博主整合的代码,在这里写一下笔记:

前面准备:

1、微信公众号:

    独特的appid、appscrect、接口权限之中设置可以获取用户ID信息权限的域名(每个用户对于不同公众都会有一个特有ID,通过这个ID获取用户微信账号基本信息、详情看微信开发者文档)、在微信支付按钮出设置微信支付授权目录(写到发起请求的控制器那一层)、设置开发者微信账号为测试白名单(用微信开发者工具的时候需要)

2、微信支付平台:

  商户平台登陆账号、支付密钥(随时可以自行设置,只能有一个)、

3、整合进去thinkphp之中逻辑:

  前端微信支付按钮设置点击调用支付发起控制器方法、

  控制器运行,引用微信支付类、获取用户openid、获取订单数据、拼接出所有普通商户预支付jsp需要的数据,display出那个自定义的支付页面、

  在支付页面点击支付、调用微信提供的jspi发起支付的scripet函数发起支付、

  支付完成以后页面会重定向到(在自定义支付页面的script函数里设置的跳转目录{:U('controller/function)}),并且异步(静默)设置的异步处理订单逻辑(记录支付时间啦、标记为已经支付啦、标记是微信支付啦)之类的、

代码:

  我的订单页面的微信支付按钮:

<a href="{:U('Wxpay/js_api_start',array('order_key_num'=>$v['order_key_num]))}"> 微信支付</a>

发起支付控制器Wxpay:

<?php
namespace Home\Controller;
use Think\Controller;
//微信支付类
class WxpayController extends Controller {
 //获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
 public function js_api_start(){
  if(!empty($_GET['order_key_num'])){
   // session(array('pay_now_id'=>$_GET['order_key_num'],'expire'=>3600));
   S('pay_now_id',$_GET['order_key_num'],3600);
  }
  vendor('Weixinpay.WxPayPubHelper');
  //使用jsapi接口
  $jsApi = new \JsApi_pub();
  //=========步骤1:网页授权获取用户openid============
  //通过code获得openid
   if($_GET['code'] == ''){
   //跳转
    $redirect_uri = 'https://当前域名+模块+控制器+方法';
    $url = 'https://open.weixin.qq.com/connect/oauth2/authorize
    ?appid=公众号特有IDredirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect';
    header("Location: $url");
    exit();
   }else{
   //获取openid
   $url = 'https://api.weixin.qq.com/sns/oauth2/access_token
   ?appid=公众号ID&secret=公众号scrept&code='.$_GET['code'].'&grant_type=authorization_code'; 
   $openid_arr = json_decode(file_get_contents($url),true);
  }
  $openid=$openid_arr['openid'];
  $pay_now_id = S('pay_now_id');
  if($pay_now_id){
   $id=$pay_now_id;
   $o = D('order_info');
   $order_info = $o->where('order_id = %d',$id)->find();
   if(empty($order_info['paycode'])){
    $order_info['paycode'] = 'weixin';
   }
   if($order_info['is_pay']){
    $this->error('当前订单已经支付');
   }
  }else{
   $this->error("不存在当前订单编号!");
  }
   $res = array(
   'order_sn' => $order_info['order_sn'],
   'order_amount' => $order_info['pay_money']
   );
  //=========步骤2:使用统一支付接口,获取prepay_id============
  //使用统一支付接口
  $unifiedOrder = new \UnifiedOrder_pub();
  //设置统一支付接口参数
  //设置必填参数
  //appid已填,商户无需重复填写
  //mch_id已填,商户无需重复填写
  //noncestr已填,商户无需重复填写
  //spbill_create_ip已填,商户无需重复填写
  //sign已填,商户无需重复填写
  $total_fee = $order_info['pay_money']*100;
  // $total_fee = $res['order_amount'];
  //$total_fee = 1;
  // var_dump($order_info['pay_money']);die;
  $body = "订单支付";
  $unifiedOrder->setParameter("openid", "$openid");//用户标识
  $unifiedOrder->setParameter("body", '商品采购');//商品描述
  //自定义订单号,此处仅作举例
  $unifiedOrder->setParameter("out_trade_no", R"C*B;
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP