关于微信小程序支付后台代码
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协议;抱歉,我也没找到!