小程序-微信支付

一、写在前面:

支付功能在之前的文章里也有提到过,不过大同小异,记录下来,希望对新手提供一些帮助。首先你对这个肯定不陌生:小程序开发文档。

二、步骤:

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)

}

});

}

 

你可能感兴趣的:(微信,php)