有关于app或小程序,调用微信支付生成签名等接口写法
小白 2020-07-15 【thinkphp5.1】
网上有很多案例
tp后台接口写法,复制就能用:
/** * 提交订单生成签名 * 返回前台支付 */ public function wei_pay() { $orderId = input('order_id', 0); $open_id = input('openid', 0); $type = input('type', 0);//1商品购买,2课程购买 if (!$orderId || $orderId == 0 || !$open_id || $open_id == 0) { return json(['code' => 500, 'msg' => '参数错误',]); } $weixin = Config::get('weixinpay.'); $info = OrderModel::where(['id' => $orderId, 'uid' => openid($open_id)])->find(); if (!$info) { return json(['code' => 500, 'msg' => '订单不存在',]); } //回调的url【自己填写】 if ($type == 1) { $notify_url = 'https://' . $_SERVER['HTTP_HOST'] . '/index.php/api/index/goodspay';//回调的url【自己填写】'; } else { $notify_url = 'https://' . $_SERVER['HTTP_HOST'] . '/index.php/api/index/kechengpay';//回调的url【自己填写】'; } $appid = $weixin['APPID'];//如果是公众号 就是公众号的appid $body = $type == 1 ? '商品购买' : '课程购买';//【自己填写】 $mch_id = $weixin['MCHID'];//商户号 $nonce_str = $this->nonce_str();//随机字符串 $openid = $open_id; //'用户的openid【自己填写】'; $out_trade_no = $info['order_sn'];//商户订单号 $spbill_create_ip = get_client_ip();//'服务器的ip【自己填写】'; $total_fee = $info['price'] * 100;//因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*100 $trade_type = 'JSAPI';//交易类型 默认 //这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错 $post['appid'] = $appid; $post['body'] = $body; $post['mch_id'] = $mch_id; $post['nonce_str'] = $nonce_str;//随机字符串 $post['notify_url'] = $notify_url; $post['openid'] = $openid; $post['out_trade_no'] = $out_trade_no; $post['spbill_create_ip'] = $spbill_create_ip;//终端的ip $post['total_fee'] = $total_fee;//总金额 最低为一块钱 必须是整数 $post['trade_type'] = $trade_type; $sign = $this->sign($post);//签名 $post_xml = '<xml> <appid>'.$appid.'</appid> <body>'.$body.'</body> <mch_id>'.$mch_id.'</mch_id> <nonce_str>'.$nonce_str.'</nonce_str> <notify_url>'.$notify_url.'</notify_url> <openid>'.$openid.'</openid> <out_trade_no>'.$out_trade_no.'</out_trade_no> <spbill_create_ip>'.$spbill_create_ip.'</spbill_create_ip> <total_fee>'.$total_fee.'</total_fee> <trade_type>'.$trade_type.'</trade_type> <sign>'.$sign.'</sign> </xml> '; //统一接口prepay_id // return $post_xml; $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $xml = $this->http_request($url, $post_xml); $array = $this->xml($xml);//全要大写 if ($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS') { $time = time(); $tmp =[] ;//临时数组用于签名 $tmp['appId'] = $appid; $tmp['nonceStr'] = $nonce_str; $tmp['package'] = 'prepay_id=' . $array['PREPAY_ID']; $tmp['signType'] = 'MD5'; $tmp['timeStamp'] = "$time"; $data['code'] = 200; $data['state'] = 1; $data['timeStamp'] = "$time";//时间戳 $data['nonceStr'] = $nonce_str;//随机字符串 $data['signType'] = 'MD5';//签名算法,暂支持 MD5 $data['package'] = 'prepay_id=' . $array['PREPAY_ID'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=* $data['paySign'] = $this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档; $data['out_trade_no'] = $out_trade_no; } else { $data['code'] = 500; $data['msg'] = $array; $data['state'] = 0; $data['text'] = "错误"; $data['RETURN_CODE'] = $array['RETURN_CODE']; $data['RETURN_MSG'] = $array['RETURN_MSG']; } return json(['code' => 200, 'msg' => '提交成功', 'data' => json_encode($data)]); } //签名 $data要先排好顺序 public function sign($data) { $stringA = []; foreach ($data as $key => $value) { if (!$value) continue; if ($stringA) $stringA .= '&' . $key . "=" . $value; else $stringA = $key . "=" . $value; } //申请支付后有给予一个商户账号和密码,登陆后自己设置key $wx_key = Config::get('weixin.KEY'); $stringSignTemp = $stringA . '&key=' . $wx_key;//申请支付后有给予一个商户账号和密码,登陆后自己设置key return strtoupper(md5($stringSignTemp)); } //随机32位字符串 private function nonce_str() { $result = ''; $str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz'; for ($i = 0; $i < 32; $i++) { $result .= $str[rand(0, 48)]; } return $result; } //curl请求啊 function http_request($url, $data = null, $headers = array()) { $curl = curl_init(); if (count($headers) >= 1) { curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } //获取xml private function xml($xml) { $p = xml_parser_create(); xml_parse_into_struct($p, $xml, $vals, $index); xml_parser_free($p); $data = []; foreach ($index as $key => $value) { if ($key == 'xml' || $key == 'XML') continue; $tag = $vals[$value[0]]['tag']; $value = $vals[$value[0]]['value']; $data[$tag] = $value; } return $data; }
转摘
最新发布
- 守护进程-kill端口-输出日志-查看等!
- git 本地分支关联远程分支,合并!
- pytorch安装(含cuda、cudnn安装教程)!
- linux系统下ubuntu22.04安装Docker方法!
- 视频截取封面 =php-ffmpeg/php-ffmpeg!
- 常用实例2023-5-10!
- 富文本 塞入mysql 报错: General error: 1366 Incorrect string value: ‘\xF0\x9F\x98\x84‘ for column ‘content‘!
- 百度地图拖拽获取地址实例!
- php使用smtp鉴权方式发送邮件 插件PHPMailer!
- 有道翻译接口对接!