小程序的支付的完整代码(php)
下面为后台代码
function pay(){
$openid = "用户的openid"
$money ="需要支付的金额" ; //
(!$lawyer_id) && $this->response(500,"参数错误");
(!$money) && $this->response(500,"选择金额错误!");
$orderCode = date("YmdHis"); // 订单号
// 随机字符串
$str="QWERTYUIPADGHJKLZXCVNM1234567890";
$nonce = str_shuffle($str);
$appid = '你的小程序appid';
$key = "你的商户秘钥";
$mch_id = "你的商户号";
$pay['appid'] = $appid;
$pay['body'] = 'test'; //商品描述
$pay['mch_id'] = $mch_id; //商户号
$pay['nonce_str'] = $nonce; //随机字符串
$pay['notify_url'] = '异步接收微信支付结果通知的回调地址';
$pay['openid'] = $openid;
$pay['out_trade_no'] = $orderCode; //订单号
$pay['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; // 终端IP
$pay['total_fee'] = 100*$money; //支付金额
$pay['trade_type'] = 'JSAPI'; //交易类型
// 组建签名(不可换行 空格 否则哭吧)
$stringA="appid=".$pay['appid']."&body=".$pay['body']."&mch_id=".$pay['mch_id']."&nonce_str=".$pay['nonce_str']."¬ify_url=".$pay['notify_url']."&openid=". $pay['openid']."&out_trade_no=".$pay['out_trade_no']."&spbill_create_ip=". $pay['spbill_create_ip']."&total_fee=".$pay['total_fee']."&trade_type=".$pay['trade_type'];
$stringSignTemp=$stringA."&key=".$key; //注:key为商户平台设置的密钥key(这个还需要再确认一下)
$sign= strtoupper(md5($stringSignTemp)); //注:MD5签名方式
$pay['sign'] = $sign; //签名
// 统一下单请求
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
$data = $this->arrayToXml($pay);
// return $data;
$res = $this->wxpost($url,$data);
// return $res; //返回统一下单结果
// 对 统一下单返回得参数进行处理
$pay_arr = $this->xmlToArray($res); //这里是数组
if ($pay_arr['return_code'] == 'FAIL' || $pay_arr['result_code'] == 'FAIL')
{
echo json_encode($res);exit;
// return $res;
}
// 调起支付数据签名字段
$timeStamp = time();
$nonce_pay = str_shuffle($str);
$package = $pay_arr['prepay_id'];
$signType = "MD5";
$stringPay = "appId=".$appid."&nonceStr=".$nonce_pay."&package=prepay_id=".$package."&signType=".$signType."&timeStamp=".$timeStamp."&key=".$key;
$paySign = strtoupper(md5($stringPay));
$rpay['timeStamp'] = (string)$timeStamp;
$rpay['nonceStr'] = $nonce_pay;
$rpay['package'] = "prepay_id=".$package;
$rpay['signType'] = $signType;
$rpay['paySign'] = $paySign;
$rpay['orders'] = $orderCode ; //订单流水号id $order
echo json_encode($rpay);
}
异步处理函数
function notify_url(){
$receipt = $_REQUEST;
if($receipt==null){
$receipt = file_get_contents("php://input");
}
if($receipt == null){
$receipt = $GLOBALS['HTTP_RAW_POST_DATA'];
}
$post_data = $this->xmlToArray($receipt);
$postSign = $post_data['sign'];
unset($post_data['sign']);
ksort($post_data);// 对数据进行排序
$str = $params = http_build_query($post_data);//对数组数据拼接成key=value字符串
$user_sign = strtoupper(md5($str."&key=您的商户密钥")); //再次生成签名,与$postSign比较
$ordernumber = $post_data['out_trade_no'];// 订单可以查看一下数据库是否有这个订单
if($post_data['return_code']=='SUCCESS'&& $postSign == $user_sign){
// 查询订单是否已经支付(通过订单号调取微信的查询订单的接口)
//如果已经支付 更改数据库中的 支付状态 并写入日志表
file_put_contents('wxPaylog.txt',$res);
if($result['data']){
// 进行更改支付成功状态
}else{
echo '微信支付失败,数据未存在该订单。';
}
}else{
// 写个日志记录
file_put_contents('wxPaylog.txt',$post_data['return_code'].PHP_EOL, FILE_APPEND);
echo '微信支付失败';
echo "success";
}
}
post 请求
function wxpost($url,$post)
{
//初始化
$curl = curl_init();
$header[] = "Content-type: text/xml";//定义content-type为xml
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
// curl_setopt($curl, CURLOPT_HEADER, 1);
//定义请求类型
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//设置post数据
$post_data = $post;
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
//显示获得的数据
// print_r($data);
if ($data)
{
curl_close($curl);
return $data;
}else{
$res = curl_error($curl);
curl_close($curl);
return $res;
}
}
将数组转化为xml数据格式
function arrayToXml($arr){
$xml = "<xml>";
foreach ($arr as $key=>$val){
if(is_array($val)){
$xml.="<".$key.">".$this->arrayToXml($val)."</".$key.">";
}else{
$xml.="<".$key.">".$val."</".$key.">";
}
}
$xml.="</xml>";
return $xml;
}
将XML转化为json/数组
function xmlToArray($xml,$type='')
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
//simplexml_load_string()解析读取xml数据,然后转成json格式
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($type == "json") {
$json = json_encode($xmlstring);
return $json;
}
$arr = json_decode(json_encode($xmlstring), true);
return $arr;
}
小程序代码
wx.request({
url: '请求参数的地址获得下面调用支付时需要的参数',
data: {'需要传入后台的参数'},
success: function (res) {
var rest = res.data;
console.log(rest)
// 调用支付接口开始
wx.requestPayment({
timeStamp: rest.timeStamp,
nonceStr: rest.nonceStr,
package: rest.package,
signType: rest.signType,
paySign: rest.paySign,
success: function(res) {
console.log(res)
},
fail: function(res) {
console.log(res)
},
complete: function(res) {
console.log(res)
},
})
}
})