一、写在前面:
支付功能在之前的文章里也有提到过,不过大同小异,记录下来,希望对新手提供一些帮助。首先你对这个肯定不陌生:小程序开发文档。
二、步骤:
1)通过微信小程序发送下单支付请求,到自己服务器,参数就是商品的一些信息。(下订单)
2)服务器调用微信小程序登录API,服务器后台返回openid,商户服务器生成订单,调用统一下单API,返回预付单信息(prepay_id),将组合再次签名(服务端操作)返回支付参数(5个必须参数和sign);
微信小程序中发起下单请求到自己服务器,这时候就可把相应的把小程序支付API需要的信息都返回给我们的微信小程序了。
3)调用wx.requestPayment,按照规则传入我们需要的信息。
4)后面就是支付成功失败的回调和显示。
三、代码:
服务端:
//下订单
public function addUserOrder(Request $request)
{
$params = $request->all();
$data = UserInfo::userAddOrder($params);
if ($data) {
$set['order_sn'] = $data['order_sn'];
$set['account'] = $data['pay_price'];
$set['openid'] = $params['openid'];
$pay = pay_wx($set);
$result['code'] = 1;
$result['data'] = $data;
$result['data']['pay'] = $pay;
} else {
$result['code'] = 90002;
$result['msg'] = "创建失败";
}
return $result;
}
//模型
public static function userAddOrder($params)
{
$arr = ['openid','user_id', 'token','status','pay_price', 'type'];
$data = array();
foreach ($arr as $v) {
if (array_key_exists($v, $params)) {
$data[$v] = $params[$v];
}
}
$u = Order::addOrder($data);
if ($u) {
return $u;
}
}
//生成签名及下单-方法
function pay_wx($data)
{
try {
$body = "会员充值";
$subject = "充值";
//微信 配置文件
$wxConfig = array(
'use_sandbox' => false,// 是否使用 微信支付仿真测试系统
'app_id' => 'wxf4daxxxxxe123a', //ID
'mch_id' => '1493333372',// 商户id
'md5_key' => 'eeeeee20180815183012345678901234',//用户在商户中心设置的api密钥
'app_cert_pem' => base_path(). DIRECTORY_SEPARATOR . 'public'. DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem',//证书pem格式
'app_key_pem' => base_path(). DIRECTORY_SEPARATOR . 'public'. DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_key.pem',//证书密钥pem格式
'sign_type' => 'MD5',// MD5 HMAC-SHA256
'limit_pay' => [
'no_credit',
],// 指定不能使用信用卡支付 不传入,则均可使用
'fee_type' => 'CNY',// 货币类型 当前仅支持该字段
'notify_url' => 'https://xxx.baidu.com/',
'redirect_url' => '',// 如果是h5支付,可以设置该值,返回到指定页面
'return_raw' => false,// 在处理回调时,是否直接返回原始数据,默认为true
);
// 订单信息
$payData = [
'body' => $body,
'subject' => $subject,
'order_no' => $data['order_sn'],
'timeout_express' => time() + 600,// 表示必须 600s 内付款
'amount' => $data['account'],// 微信沙箱模式,需要金额固定为3.01
'return_param' => '微信支付',
'client_ip' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1',// 客户地址
'openid' =>$data['openid'],//本人的open_id,应该从数据库获取相应的
];
$ret = Charge::run(Config::WX_CHANNEL_LITE, $wxConfig, $payData);
//这里是自己生成的签名
$appid = $ret['appId'];
$noncestr = $ret['nonceStr'];
$package = $ret['package'];
$timestamp = $ret['timeStamp'];
$signStr = "appId=$appid&nonceStr=$noncestr&package=$package&signType=MD5&timeStamp=$timestamp&key=xxxxxx20180815183012345678901234";
$ret['paySign'] = strtoupper(md5($signStr));
$str = $ret;
} catch (PayException $e) {
echo $e->errorMessage();exit;
}
return $str;
}
//修改支付订单状态
public function editUserOrder(Request $request)
{
$params = $request->all();
$data = UserInfo::userEditOrder($params);
if ($data) {
$result['code'] = 1;
$result['data'] = $data;
} else {
$result['code'] = 90002;
$result['msg'] = "修改失败";
}
return $result;
}
//模型
public static function userEditOrder($params)
{
$arr = ['openid','user_id','token','status','order_sn','pay_price','type'];
$data = array();
foreach ($arr as $v) {
if (array_key_exists($v, $params)) {
$data[$v] = $params[$v];
}
}
//更改用户会员截止时间
$save1['m_time'] =time()+365*24*60*60;
$member = Users::where('id', $params['user_id'])->update($save1);
if($member){
$save['status'] = $data['status'];
return Order::where('order_sn', $params['order_sn'])->update($save);
}else{
return false;
}
}
前端:
payDirect: function() {
var n = this,
a = n.data.money;
if ("" !== a && 0 !== a)
if (Number(a))
if (a.toString().split(".").length > 1 && a.toString().split(".")[1].length > 2) e.showToast("您输入的金额不合法", function(t) {}, "none");
else {
var o = {
type: 1,
pay_price: a,
status: 2,
openid: n.data.userInfo.openid
};
t.postRequest("order-add", "POST", o, function(t) {
var o = t.data.code,
s = t.data.msg,
i = t.data.data;
n.setData({
pay_object: i
})
n.getPayConfig(i.order_sn, a);
// 1 === o ? n.getPayConfig(i.order_sn, a) : e.showToast(s,function(t){},"none");
});
}
else e.showToast("您输入的金额不合法", function(t) {}, "none");
else e.showToast("请输入金额", function(t) {}, "none");
},
getPayConfig: function(n, a) {
var o = this;
if (n) {
var s = {
order_sn: n,
money: a,
openid: this.data.userInfo.openid
};
t.postRequest("pay-money-config", "POST", s, function(t) {
var a = t.data.code,
s = t.data.data;
o.payOrder(s, n);
});
}
},
payOrder: function(n, a) {
var o = this;
wx.requestPayment({
timeStamp: o.data.pay_object.pay.timeStamp.toString(),
nonceStr: o.data.pay_object.pay.nonceStr,
package: o.data.pay_object.pay.package,
signType: "MD5",
paySign: o.data.pay_object.pay.paySign,
success: function(n) {
if (new RegExp("ok").test(n.errMsg)) {
var s = {
status: 1,
order_sn: a,
pay_price: o.data.money,
user_id: o.data.userInfo.user_id,
type: 1
};
t.postRequest("order-edit", "POST", s, function(t) {
var n = t.data.code;
t.data.data;
1 === n && e.showToast("支付成功!", function(t) {
wx.switchTab({
url: "/pages/center/center"
});
});
}, function() {
console.log('修改失败')
});
} else t.showModel("支付失败!", function(t) {});
},
fail: function(t) {
console.log('ccc' + t)
}
});
}