微信小程序支付

关于微信小程序支付后台代码

public function weixin($order,$user){


        // 需要传递的参数
        $post = array(

            'appid'=>Config::get('AppId'),

            'mch_id'=>Config::get('MchId'),//mch_id

            'nonce_str'=>md5($order['order_sn']),//nonce_str

            'body'=>'知识付费小程序',

            'out_trade_no'=>$order['order_sn'],

            //'total_fee'=>$order['order_amount']*100,
            'total_fee'=>1,

            'spbill_create_ip' => $_SERVER['SERVER_ADDR'],

            'notify_url'=>Config::get("MyHttp").'/index.php/Api/Pay/callback',

            'trade_type'=>'JSAPI',

            'openid'=>trim($user['openid']),

            'attach'=>'支付测试',

        );

        // 获取签名
        $post['sign'] = $this->get_sign($post);



        // 生成XML
        $post_data = $this->arrayToXml($post);

        // file_put_contents("666.txt", $post_data );

        // 请求路径
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

        // curl 请求接口
        $dataxml =$this->http_post($url, $post_data);

        $objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的XML 转换成数组


        if ($objectxml['return_code'] == 'SUCCESS' && $objectxml['result_code'] == 'SUCCESS') {

            $arrdata =[

                'appId'=>Config::get('AppId'),

                'timeStamp'=>'' . time() . '',

                'nonceStr'=>$objectxml['nonce_str'],

                'package'=>"prepay_id=".$objectxml['prepay_id'],

                'signType'=>'MD5',

            ];

      // 生成数据返回给小程序 唤起支付
          $arrdata['paySign'] = MD5('appId='.$arrdata['appId'].'&nonceStr='.$arrdata['nonceStr'].'&package='.$arrdata['package'].'&signType='.$arrdata['signType'].'&timeStamp='.$arrdata['timeStamp'].'&key='.Config::get('key'));

            return $arrdata;
        }
        return false;

    }
// 生成签名
    public function get_sign($arrdata){

        // 数组序列化
        $strdata = $this->myKsort($arrdata);

        //  串上KEY
        $strSignTmp = $strdata."&key=".Config::get('key');

        // md5加密
        $sign = MD5($strSignTmp);

        // 数据小写
        $sign = strtoupper($sign);

        return $sign;
    }

 // 数组转XML
    protected function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {

            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            // if (is_numeric($val)){
            //     $xml.="<".$key.">".$val."</".$key.">";
            // }else{
            //      $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            // }
        }
        $xml.="</xml>";
        return $xml;
    }
private function http_post($url = '', $post_data = array(), $header = array(), $timeout = 30)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 从证书中检查SSL加密算法是否存在
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }

注:在这块通常会有个坑;微信支付完成后没有数据回调到服务器,参数notify_url配置没有问题。外网可以直接访问!你需要吧路径里的https修改成http就好了。至于什么原因导致回调信息不接受https协议;抱歉,我也没找到!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值