ThinkPHP V5.0 接入微信支付+回调

薛定谔的盒子猫
• 阅读 1411

ThinkPHP V5.0 接入微信支付

微信支付接口

  • 组装访问数组

    $data['body'] = '商城购买商品';//订单标题
    $data['out_trade_no'] = generate_rand_str(8, 0);//平台订单号(非小程序订单,自己平台生成的)
    $data['notify_url'] = $this->request->domain().'';//微信支付回调地址,不带参数
    $data['total_fee'] = $price;//价格,单位(元)
    $data['openid'] = $this->user['openid'];//用户openid
    $res = $this->unifiedorder($config['wechat_appid'],$config['wechat_mch_id'],$config['wechat_key'],$data);//访问统一下单
  • 统一下单

    /**
    * 统一下单方法
    * $appid 小程序id
    * $mchid 商户号
    * $key 微信支付key
    * $data 信息数组
    * */
    public function unifiedorder($appid,$mch_id,$key,$data)
    {
      $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';//微信统一下单访问url
      $parameters = array(
          'appid' => $appid, //小程序ID
          'mch_id' => $mch_id, //商户号
          'nonce_str' => generate_rand_str(8, 0), //随机字符串
          'body' => $data['body'], //商品描述
          'out_trade_no' => $data['out_trade_no'], //商户订单号
          'total_fee' => floatval($data['total_fee'] * 100), //总金额 单位 分
          'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP
          'notify_url' => $data['notify_url'].'index.php/callback', //通知地址 确保外网能正常访问
          'openid' => $data['openid'], //用户id
          'trade_type' => 'JSAPI'//交易类型//要是返回该产品权限未开通请在产品中心开通jsAPi他包含的小程序支付
      );
      //统一下单签名
      $parameters['sign'] = $this->getSign($parameters,$key);
      $xmlData = $this->arrayToXml($parameters);
      $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
      return $return;
    }

生成随机数

/**
 * 生成随机字符串
 * @param int $length 生成长度
 * @param int $type 生成类型:0-小写字母+数字,1-小写字母,2-大写字母,3-数字,4-小写+大写字母,5-小写+大写+数字
 * @return string
 */
function generate_rand_str($length = 8, $type = 0) {
    $a = 'abcdefghijklmnopqrstuvwxyz';
    $A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $n = '0123456789';

    switch ($type) {
        case 1: $chars = $a; break;
        case 2: $chars = $A; break;
        case 3: $chars = $n; break;
        case 4: $chars = $a.$A; break;
        case 5: $chars = $a.$A.$n; break;
        default: $chars = $a.$n;
    }

    $str = '';
    for ($i = 0; $i < $length; $i++) {
        $str .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    }
    return $str;
}

生成签名

/**
 * 生成签名
 * @param array $Obj 访问数组
 * @param string $key 商户key
 * @return string
 */
public function getSign($Obj,$key) {
    foreach ($Obj as $k => $v) {
        $Parameters[$k] = $v;
    }
    //签名步骤一:按字典序排序参数
    ksort($Parameters);
    $String = $this->formatBizQueryParaMap($Parameters, false);
    //签名步骤二:在string后加入KEY
    $String = $String . "&key=" . $key;
    //签名步骤三:MD5加密
    $String = md5($String);
    //签名步骤四:所有字符转为大写
    $result_ = strtoupper($String);
    return $result_;
}

格式化参数,签名过程需要使用

//作用:格式化参数,签名过程需要使用
public function formatBizQueryParaMap($paraMap, $urlencode) {
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v) {
        if ($urlencode) {
            $v = urlencode($v);
        }
        $buff .= $k . "=" . $v . "&";
    }
    $reqPar = array();
    if (strlen($buff) > 0) {
        $reqPar = substr($buff, 0, strlen($buff) - 1);
    }
    return $reqPar;
}

数组转换成xml

//数组转换成xml
public function arrayToXml($arr) {
    $xml = "<root>";
    foreach ($arr as $key => $val) {
        if (is_array($val)) {
            $xml .= "<" . $key . ">" . $this->arrayToXml($val) . "</" . $key . ">";
        } else {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        }
    }
    $xml .= "</root>";
    return $xml;
}

xml格式访问

public function postXmlCurl($xml, $url, $second = 30)
{
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, $second);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
    //设置header
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    //要求结果为字符串且输出到屏幕上
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    //post提交方式
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_TIMEOUT, 40);
    set_time_limit(0);
    //运行curl
    $data = curl_exec($ch);
    //返回结果
    curl_close($ch);
    return $data;
}

将xml转换成数组

 public function xmlToArray($xml) {
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    $val = json_decode(json_encode($xmlstring), true);
    return $val;
}

微信支付成功回调接口

//微信支付回调
public function callback()
{
    $postXml = file_get_contents("php://input");//获取回调的xml格式
    $attr = $this->xmlToArray($postXml);//将获取的xml转为数组
    if($attr['result_code'] == 'SUCCESS'){
        //在此书写支付成功后的逻辑
        return true;
    }else{
        //在此书写支付失败后的逻辑
        return false;
    }
}
点赞
收藏
评论区
推荐文章
vue h5 对接支付宝,微信支付,微信js支付
vueh5实现支付(支付宝,微信)h5端实现支付难度不大,只是有些小的点需要注意下,其他的看文档撸就行了。支付宝很简单,后端返回一个html,前端插入调用就行了,微信支付分两种:1、微信内支付(jsapi,微信内浏览器)2、微信外支付(h5支付)。一、支付宝支付//前端啥都不用管,交给后端去干,返回html调用点击就好了/
翼
3年前
微信支付 (JSSDK支付)
官方文档微信支付https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter7_7&index6微信授权获取codehttps://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JSSDK.html58准备工作微信公
胡哥有话说 胡哥有话说
3年前
微信小程序支付功能全流程实践
前言微信小程序为电商类小程序,提供了非常完善、优秀、安全的支付功能。在小程序内可调用微信的API完成支付功能,方便、快捷。小程序开发者在开发小程序时,支付流程是必然要接触到,今天胡哥就小程序支付的全流程为大家一一细说,让小伙伴能快速得掌握小程序支付能力,避免踩坑!知己知彼,方能百战不殆小程序支付流程图小程序支付交互流程图(https:/
Easter79 Easter79
2年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
Easter79 Easter79
2年前
springboot接入微信app支付
一:集成步骤1.引入依赖:<dependency<groupIdcom.github.wxpay</groupId<artifactIdwxpaysdk</artifactId<version0.0.3</version</dependency
Wesley13 Wesley13
2年前
PHP微信小程序支付——签名错误
!(https://static.oschina.net/uploads/space/2018/0509/141657_Tqix_3477605.png)先分清几个概念:微信公众平台、微信开放平台、微信商户平台1.微信公众平台、微信开放平台、微信商户平台是三个不同的平台2.微信公众平台:用于公众号、小程序等等的设置平台,包括APPID、APP
Wesley13 Wesley13
2年前
h5 接入微信支付
我们公司,现在用ping做h5接入,用的是h5"壹收款"准备:如果公司,现在还没有公众号的话,支付宝。可以把这些工作,给ping来做这些事情 1.注册微信公众号,开通支付功能。2.注册ping (如果是自己开开通的微信支付,要填写相关信息)3.微信设置网页授权获取用户基本信
liam liam
7个月前
Postman 调试微信支付接口教程,一看就会
前期准备在使用Postman调试微信支付接口之前,你需要做好以下准备:安装客户端应用,或使用网页版;成为;已申请。当你已经具备这三个条件,就可以进入微信支付接口调试之旅了脚本导入方式一:通过fork方式为了帮助商户开发者快速上手,微信官方将调试微信支付接口
Wesley13 Wesley13
2年前
Java实现小程序微信支付
小程序支付流程交互图: !(https://oscimg.oschina.net/oscnet/39ddb4bb2025a7f5daeb0d5663bb12faba7.png)进入小程序,下单,请求下单支付,调用小程序登录API来获取Openid,生成商户订单//pages/pay/pay.jsvarappget
Wesley13 Wesley13
2年前
B2B或B2C或B2B2C平台如何实现结算功能
问:B2C商城,在对每个商家结算时,必须要直接结算到微信支付宝银行卡,而不能先结算到平台上,之后自行提现吗?据说这是法律限制,是因为没有支付牌照吗?如果是这样的话,那么系统的设计是从微信/..等支付的时候,就是用商家的微信账户,还是在结算时使用统一的账户打入商家账户中?答:的确是因为牌照的关系,因为你做B2C电商,提供服务的是
薛定谔的盒子猫
薛定谔的盒子猫
Lv1
男 · 四川智慧谦益科技有限公司 · 技术总监
暮雨不来春不去,花满地月朦胧。
文章
7
粉丝
2
获赞
2