public function weixinpay(){
$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
$openid = $this->input->get('openid'); //用户唯一标示
$amount =$this->input->get('amount'); //付款金额
$payment_id = $this->_get_pay_code();//订单号,可以自定义,但不能重复使用
//根据openid查询用户信息
$userinfo = $this->answer_m->get_userinfo_by_openid($openid);
if (empty($userinfo)){
exit('查询用户信息失败');
}
// 创建订单
$code = $this->_get_pay_code();
$openid = $userinfo['openid'];
$user_id = $userinfo['id'];
$nickname = $userinfo['nickname'];
$this->answer_m->create_order($user_id,$openid,$code,$amount);
// 执行支付
$parameters = array(
'mch_appid' =>self::MCH_APPID,//绑定支付的APPID
'mchid' => self::MCHID,//商户号
'nonce_str' => $this->create_noncestr(32), //生成32位的随机字符串
'partner_trade_no' => $payment_id, //商户订单号,不能重复使用
'openid' => $openid,//用户的open_id
'check_name' => 'NO_CHECK',//是否检查姓名
// 're_user_name' => $transfer['real_name'], //真实姓名
'amount' => bcmul($amount,100,0), //企业付款金额,单位为分 最低1元
'desc' => '答题奖金',//备注
'spbill_create_ip' => strval($_SERVER['SERVER_ADDR']),//服务器IP
);
$parameters['sign'] = $this->getSign($parameters, self::PAY_KEY);//getSign商户支付密钥
$xml = $this->arrayToXml($parameters);
$response = $this->postXmlCurl($xml, $url,true);
$result = $this->xmlToArray($response);
if($result['return_code']=='SUCCESS'){
if($result['result_code']=='SUCCESS'){
$this->success($payment_id.'=payment_id 付款成功');
$this->answer_m->update_order($code);
return true;
}else{
$data = $result['err_code_des'].' 付款失败';
return false;
}
}else{
$data = '付款失败,微信接口出现异常';
return false;
}
}
public function create_noncestr($length=16){
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
// 生成签名
public function getSign($obj,$key){
foreach ($obj as $k => $v) {
$parameters[$k] = $v;
}
ksort($parameters);
$string = $this->formtBizQueryParMap($parameters,false);
$string = $string."&key=".$key;
// var_dump($string);
$string = md5($string);
$result =strtoupper($string);
// var_dump($result);die;
return $result;
}
public function arrayToXml($arr){
$xml = "<xml>";
foreach ($arr as $key => $value) {
if(is_numeric($value)){
$xml .= "<" .$key. ">" .$value ."</" .$key .">";
}else{
$xml .= "<" .$key. "><![CDATA[".$value."]]></".$key.">";
}
}
$xml .="</xml>";
return $xml;
}
public function postXmlCurl($xml,$url,$userCert= false,$second= 30){
$ch = curl_init();
// 设置超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //严格模式
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if($userCert ==true){
// 设置证书
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
curl_setopt($ch, CURLOPT_SSLCERT, '');//证书位置相对路径
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'pem');
curl_setopt($ch, CURLOPT_SSLKEY, ''); //证书位置 相对路径
}
// post 提交
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
// 运行curl
$data = curl_exec($ch);
// 返回结果
if($data){
curl_close($ch);
return $data;
}else{
$error = curl_error($ch);
curl_close($ch);
$this->error("curl出错,错误码".$error,'wxpostXmlCurl');
}
}
// 将xml 转array
public function xmlToArray($xml){
$array_data = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),TRUE);
return $array_data;
}
// 格式化参数,签名使用
public function formtBizQueryParMap($paramap,$urlencode){
$buff = "";
ksort($paramap);
foreach ($paramap as $k => $v) {
if($urlencode){
$v = $urlencode['$v'];
}
$buff .= $k ."=".$v."&";
}
$reqpar = '';
if(strlen($buff) >0){
$reqpar = substr($buff, 0,strlen($buff)-1);
}
return $reqpar;
}
// 创建订单号
public function _get_pay_code() {
$years = array(2016=> 'A', 2017=> 'B', '2018' => 'C', 2019=> 'D');
$months = array(1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E', 6 => 'F', 7 => 'G', 8 => 'H', 9 => 'I', 10 => 'J', 11 => 'K', 12 => 'L');
$code = date('YmdHis').rand(0, 1000).rand(1000, 2000);
return $code;
}