ウィジェット-微信支払い

7688 ワード

一、前に書く:
支払い機能は前の文章でも言及されていますが、大同小異で、記録して、初心者に助けを提供してほしいと思っています.まず、これはよく知られていません.小さなプログラム開発ドキュメントです.
二、手順:
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)

}

});

}