⼩程序⽀付代码实现⼩程序端 触发调⽤⽀付接⼝:
// ⽀付
goPay : function(e){
var that = this;
var pay = e.currentTarget.dataset.pay;
var uid = that.data.uid;
var address = that.data.select_id;
url: getApp().globalData.server +'index/index/wxPay',
data: {
uid: uid,
gid: that.data.id,
address: address,
pay: pay,
num: that.data.num,
},
method: 'POST',
header: {
'content-type': 'application/json' // 默认值
},
success: function (res) {
console.log(res.data)
if(res.data == 'fail')
{
console.log('⽣成订单失败');
return false;
}else{
that.setData({
orders: ders,
}) 
}
// 调起⽀付API
'timeStamp': res.data.timeStamp,
'nonceStr': Str,
'package': res.data.package,
'signType': res.data.signType,
'paySign': res.data.paySign,
'success': function (ee) {
console.log('suc');
wx.showToast({
title: '⽀付成功',
icon: 'success',
duration: 3000
});
// 更改⽀付状态
url: getApp().globalData.server + 'index/index/notify',
data: {
order_id: ders,
state: 1,
},
header: {
'content-type': 'application/json' // 默认值
},
success: function (res) {
console.log(res.data);
}
}
})
},
'fail': function (res) {
console.log(res);
if (Msg == 'requestPayment:fail cancel'){
wx.showToast({
title: '您已取消⽀付',
icon: 'none',
duration: 3000
});
}else{
console.log('Msg');
wx.showToast({
title: '⽀付失败',
icon: 'none',
duration: 3000
});
// 更改⽀付状态
url: getApp().globalData.server +'index/index/notify',
data: {
order_id: ders,
state: -1,
},
header: {
'content-type': 'application/json' // 默认值
},
success: function (res) {
console.log(res.data);
}
})
}
},
});
}
})
},
后端:创建商户订单  统⼀下单  构建需要参数返回⼩程序 调起⽀付注:其中⽤到的请求函数  XML转换函数 参见我的另⼀篇
//    ⽀付接⼝
public function wxPay()
{
$input = input();
//        $input = json_decode($input,true);
$uid = $input['uid'];
$gid = $input['gid'];
$address = $input['address'];
$money = $input['pay'];
$num = $input['num'];
//        创建我的⽀付订单
$orderCode = $this->setOrderCode();
$order = Db::table('orders')->insertGetId([
'order_code' => $orderCode,
'goods_id' => $gid,
'pay_price' => $money,
'number' => $num,
'address_id' => $address
'address_id' => $address
]);
if ($order == false)
{
return 'fail';
}
/
/        准备统⼀下单参数(你可以调⽤wx.login获取)
$openid = Db::table('users')->where('id',$uid)->value('openid');
//        halt($openid);
//        随机字符串
$str="QWERTYUIPADGHJKLZXCVNM1234567890";
$nonce = str_shuffle($str);
//        ⼩程序id - 商户平台密钥
$appid = '你的⼩程序appid';
$key = "你的商户密钥";
$pay['appid'] = $appid;
$pay['body'] = '商品描述';              //商品描述
$pay['mch_id'] = '你的商户号';            //商户号
$pay['nonce_str'] = $str;        //随机字符串
$pay['notify_url'] = '你的地址';    //异步接收⽀付结果通知的回调地址
$pay['openid'] = $openid;
$pay['out_trade_no'] = $orderCode;      //订单号
$pay['spbill_create_ip'] = '你的IP';                    // 终端IP
$pay['total_fee'] = $money*100;                      //⽀付⾦额
$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=" //        return $stringA;
$stringSignTemp=$stringA."&key=".$key; //注:key为商户平台设置的密钥key(这个还需要再确认⼀下)
$sign= strtoupper(md5($stringSignTemp)); //注:MD5签名⽅式
$pay['sign'] = $sign;              //签名
//        统⼀下单请求
$url = "h.weixin.qq/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')
{
return $res;
代码转换}
//        组建调起⽀付参数
//        调起⽀付数据签名字段
//        $appid;
$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=".$k        $paySign = strtoupper(md5($stringPay));
$rpay['timeStamp'] = (string)$timeStamp;
$rpay['nonceStr'] = $nonce_pay;
$rpay['nonceStr'] = $nonce_pay;
$rpay['package'] = "prepay_id=".$package;
$rpay['signType'] = $signType;
$rpay['paySign'] = $paySign;
$rpay['orders'] = $order;  //订单id
return json_encode($rpay);
}
这是订单号得函数:
/**
*  ⽣成订单号
*/
function setOrderCode(){
$sql = Db::table('orders')->where('pay_state',1)->column('order_code');
$ORDERSN = $sql;                                        //静态变量
$ors = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); //        $ors=date('Ymd').substr(time(),-5).substr(microtime(),2,5);    //⽣成16位数字基本号
if (isset($ORDERSN[$ors])) {                                    //判断是否有基本订单号
$ORDERSN[$ors]++;                                          //如果存在,将值⾃增1
}else{
$ORDERSN[$ors]=1;
}
return $ors.str_pad($ORDERSN[$ors],2,'0',STR_PAD_LEFT);    //链接字符串
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。