把标注红色的修改即可
js文件:
wx.login({
success: res => {
var total_fee = 1 //总金额
// 发送 res.code 到后台换取 openId, sessionKey, unionId
wx.request({
url: "http://127.0.0.1/api/Pay/login", //请求地址
data: { code: res.code },
header: {
\'content-type\': \'application/json\'
},
success(res) {
//发起预支付,获取所需参数
wx.request({
url: \'http://127.0.0.1/api/Pay/recharge\', //请求地址
data: {
openid: res.data[\'openid\'],
total_fee: total_fee, //总金额
body: \'充值拼购卡\', //充值标题
},
method: \'POST\',
success(res) {
console.log(res)
if (res.errMsg == \'request:ok\') {
//发起微信支付
wx.requestPayment({
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
package: res.data.package,
signType: res.data.signType,
paySign: res.data.paySign,
success(r) {
console.log(r)
//写支付成功的逻辑
},
fail(r) {
wx.showToast({
title: \'取消支付\',
icon: \'none\'
})
}
})
} else {
wx.showToast({
title: res.data.data,
icon: \'none\'
})
}
}
})
}
})
}
})
},
php文件:
/*支付成功回调*/
public function getnotify(){
$testxml = file_get_contents("php://input");
$jsonxml = json_encode(simplexml_load_string($testxml, \'SimpleXMLElement\', LIBXML_NOCDATA));
$result = json_decode($jsonxml, true);//转成数组,
if($result){
//如果成功返回了
$out_trade_no = $result[\'out_trade_no\'];
if($result[\'return_code\'] == \'SUCCESS\' && $result[\'result_code\'] == \'SUCCESS\'){
//执行业务逻辑
}
}
}
/*获取用户唯一标识*/
public function login(){
$code=Request::param(\'code\');
$url="https://api.weixin.qq.com/sns/jscode2session?appid=wx69b37be568f76e3f&secret=b6ed8d48484522da769e6980fb6d5684&js_code=".$code."&grant_type=authorization_cod";
$token = json_decode($this->curl_get($url));
return json($token);
}
/*支付*/
public function recharge(){
$data=Request::post();
$fee = $data[\'total_fee\'];//金额
$appid =\'wx69b37be*****\';//appid
$body =$data[\'body\']; //标题
$mch_id =\'15668****\';//商户号
$nonce_str =$this->nonce_str();//随机字符串
$notify_url =\'http://127.0.0.1/api/Pay/getnotify\'; //回调的url【自己填写】
$openid =$data[\'openid\'];
$out_trade_no = $this->order_number($openid);//商户订单号RETURN_CODE
$spbill_create_ip = \'**.***.**.***\';//服务器的ip【自己填写】;
$total_fee = $fee*100;// 微信支付单位是分,所以这里需要*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);//签名
// return json($sign);
$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> \';
// print_r($post_xml);die;
//统一接口prepay_id
$url = \'https://api.mch.weixin.qq.com/pay/unifiedorder\';
$xml = $this->http_request($url,$post_xml);
$array = $this->xml($xml);//全要大写
// print_r($array);die;
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[\'state\'] = 200;
$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[\'state\'] = 0;
$data[\'text\'] = "错误";
$data[\'RETURN_CODE\'] = $array[\'RETURN_CODE\'];
$data[\'RETURN_MSG\'] = $array[\'RETURN_MSG\'];
}
echo json_encode($data);
}
//随机32位字符串
private function nonce_str(){
$result = \'\';
$str = \'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz\';
for ($i=0;$i<32;$i++){
$result .= $str[rand(0,48)];
}
return $result;
}
//生成订单号
private function order_number($openid){
//date(\'Ymd\',time()).time().rand(10,99);//18位
return md5($openid.time().rand(10,99));//32位
}
//签名 $data要先排好顺序
private function sign($data){
//签名步骤一:按字典序排序数组参数
// ksort($data);
$stringA = \'\';
foreach ($data as $key=>$value){
if(!$value) continue;
if($stringA) $stringA .= \'&\'.$key."=".$value;
else $stringA = $key."=".$value;
}
$wx_key = \'TangvgIBADANBgkqhkiG9*******\';//申请支付后有给予一个商户账号和密码,登陆后自己设置的key
$stringSignTemp = $stringA.\'&key=\'.$wx_key;
return strtoupper(md5($stringSignTemp));
}
//curl请求
public 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;
}
/*往微信发送信息,获取唯一标识
后台调用 避免暴露 信息*/
function curl_get($url,&$httpCode = 0){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
/*不做证书效验,部署在linux环境下请改为true*/
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
$file_contents = curl_exec($ch);
$httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
curl_close($ch);
return $file_contents;
}
protected function get_json($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output, true);
}