123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- (function(){
- var
- version = "2.0.6",
- hasOwn = {}.hasOwnProperty,
- PingppSDK = function(){},
- cfg = {
- PINGPP_NOTIFY_URL: 'https://api.pingxx.com/notify/charges/',
- UPACP_WAP_URL: 'https://gateway.95516.com/gateway/api/frontTransReq.do',
- ALIPAY_WAP_URL: 'http://wappaygw.alipay.com/service/rest.htm',
- UPMP_WAP_URL: 'uppay://uppayservice/?style=token&paydata=',
- JDPAY_WAP_URL: 'https://m.jdpay.com/wepay/web/pay',
- BFB_SUCCESS: '<html><head><meta name="VIP_BFB_PAYMENT" content="BAIFUBAO"></head><body></body></html>',
- YEEPAY_WAP_URL: 'https://ok.yeepay.com/paymobile/api/pay/request',
- YEEPAY_WAP_TEST_URL: 'http://mobiletest.yeepay.com/paymobile/api/pay/request',
- PINGPP_MOCK_URL: 'http://sissi.pingxx.com/mock.php'
- },
- channels = {
- alipay_wap: 'alipay_wap',
- upmp_wap: 'upmp_wap',
- upacp_wap: 'upacp_wap',
- bfb_wap: 'bfb_wap',
- wx_pub: 'wx_pub',
- yeepay_wap: 'yeepay_wap',
- jdpay_wap: 'jdpay_wap'
- };
- PingppSDK.prototype = {
- version: version,
- _resultCallback: undefined,
- _jsApiParameters: {},
- _debug: false,
- _signature: undefined,
- createPayment: function(charge_json, callback, signature, debug) {
- if (typeof callback == "function") {
- this._resultCallback = callback;
- }
- if (typeof signature != "undefined") {
- this._signature = signature;
- }
- if (typeof debug == "boolean") {
- this._debug = debug;
- }
- var charge;
- if(typeof charge_json == "string"){
- try{
- charge = JSON.parse(charge_json);
- }catch(err){
- this._innerCallback("fail", this._error("json_decode_fail"));
- return;
- }
- }else{
- charge = charge_json;
- }
- if(typeof charge == "undefined"){
- this._innerCallback("fail", this._error("json_decode_fail"));
- return;
- }
- if(!hasOwn.call(charge, 'id')){
- this._innerCallback("fail", this._error("invalid_charge", "no_charge_id"));
- return;
- }
- if(!hasOwn.call(charge, 'channel')){
- this._innerCallback("fail", this._error("invalid_charge", "no_channel"));
- return;
- }
- var channel = charge['channel'];
- if(!hasOwn.call(charge, 'credential')){
- this._innerCallback("fail", this._error("invalid_charge", "no_credential"));
- return;
- }
- if (!charge['credential']) {
- this._innerCallback("fail", this._error("invalid_credential", "credential_is_undefined"));
- return;
- }
- if (!hasOwn.call(channels, channel)) {
- this._innerCallback("fail", this._error("invalid_charge", "no_such_channel:" + channel));
- return;
- }
- if (!hasOwn.call(charge['credential'], channel)) {
- this._innerCallback("fail", this._error("invalid_credential", "no_valid_channel_credential"));
- return;
- }
- if(!hasOwn.call(charge, 'livemode')){
- this._innerCallback("fail", this._error("invalid_charge", "no_livemode"));
- return;
- }
- if (charge['livemode'] == false) {
- this._testModeNotify(charge);
- return;
- }
- var credential = charge['credential'][channel];
- if (channel == channels.upmp_wap) { // 调起银联支付控件,客户端需要安装银联支付控件才能调起
- location.href = cfg.UPMP_WAP_URL + credential['paydata'];
- } else if (channel == channels.upacp_wap) {
- form_submit(cfg.UPACP_WAP_URL, 'post', credential);
- } else if (channel == channels.alipay_wap) { // 调起支付宝手机网页支付
- credential['_input_charset'] = 'utf-8';
- if (typeof _AP != "undefined") {
- var query = stringify_data(credential, channel, true);
- _AP.pay(cfg.ALIPAY_WAP_URL + "?" + query);
- } else {
- form_submit(cfg.ALIPAY_WAP_URL, 'get', credential);
- }
- } else if (channel == channels.bfb_wap) {
- if (!hasOwn.call(credential, 'url')) {
- this._innerCallback("fail", this._error("invalid_credential", "missing_field:url"));
- return;
- }
- location.href = credential['url'] + '?' + stringify_data(credential, channel);
- } else if (channel == channels.yeepay_wap) {
- var fields = ["merchantaccount", "encryptkey", "data"];
- for(var k in fields){
- if(typeof fields[k] !== "function" && !hasOwn.call(credential, fields[k])){
- this._innerCallback("fail", this._error("invalid_credential", "missing_field_"+fields[k]));
- return;
- }
- }
- if (hasOwn.call(credential, "mode") && credential["mode"] == "test") {
- location.href = cfg.YEEPAY_WAP_TEST_URL + '?' + stringify_data(credential, channel, true);
- } else {
- location.href = cfg.YEEPAY_WAP_URL + '?' + stringify_data(credential, channel, true);
- }
- } else if (channel == channels.wx_pub) {
- var fields = ["appId", "timeStamp", "nonceStr", "package", "signType", "paySign"];
- for (var k in fields) {
- if (typeof fields[k] !== "function" && !hasOwn.call(credential, fields[k])) {
- this._innerCallback("fail", this._error("invalid_credential", "missing_field_"+fields[k]));
- return;
- }
- }
- this._jsApiParameters = credential;
- this._callpay();
- } else if (channel == channels.jdpay_wap) {
- form_submit(cfg.JDPAY_WAP_URL, 'post', credential);
- }
- },
- _jsApiCall: function(){
- var self = this;
- if(self._jsApiParameters != {}){
- WeixinJSBridge.invoke(
- 'getBrandWCPayRequest',
- self._jsApiParameters,
- function(res){
- if(res.err_msg == 'get_brand_wcpay_request:ok'){
- self._innerCallback("success");
- }else if(res.err_msg == 'get_brand_wcpay_request:cancel'){
- self._innerCallback("cancel");
- }else{
- self._innerCallback("fail", self._error("wx_result_fail", res.err_msg));
- }
- }
- );
- }
- },
- _callpay: function(){
- var self = this;
- if (typeof wx != "undefined" && typeof self._signature != "undefined") {
- var wxConfigFailed = false;
- wx.config({
- debug: self._debug,
- appId: self._jsApiParameters["appId"],
- timestamp: self._jsApiParameters["timeStamp"],
- nonceStr: self._jsApiParameters["nonceStr"],
- signature: self._signature,
- jsApiList: ['chooseWXPay']
- });
- wx.ready(function(){
- if (wxConfigFailed) {
- return;
- }
- wx.chooseWXPay({
- timestamp: self._jsApiParameters["timeStamp"],
- nonceStr: self._jsApiParameters["nonceStr"],
- "package": self._jsApiParameters["package"],
- signType: self._jsApiParameters["signType"],
- paySign: self._jsApiParameters["paySign"],
- success: function(res) {
- if (res.errMsg == "chooseWXPay:ok") {
- self._innerCallback("success");
- } else {
- self._innerCallback("fail", self._error("wx_result_fail", res.errMsg));
- }
- },
- cancel: function(res) {
- self._innerCallback("cancel");
- },
- fail: function(res) {
- self._innerCallback("fail", self._error("wx_result_fail", res.errMsg));
- }
- });
- });
- wx.error(function(res){
- wxConfigFailed = true;
- self._innerCallback("fail", self._error("wx_config_error", res.errMsg));
- });
- } else if (typeof WeixinJSBridge == "undefined") {
- function eventCallback(){
- self._jsApiCall();
- }
- if (document.addEventListener) {
- document.addEventListener('WeixinJSBridgeReady', eventCallback, false);
- } else if(document.attachEvent) {
- document.attachEvent('WeixinJSBridgeReady', eventCallback);
- document.attachEvent('onWeixinJSBridgeReady', eventCallback);
- }
- }else{
- this._jsApiCall();
- }
- },
- _error: function(msg, extra) {
- msg = (typeof msg == "undefined") ? "" : msg;
- extra = (typeof extra == "undefined") ? "" : extra;
- return {
- msg:msg,
- extra:extra
- };
- },
- _innerCallback: function(result, err) {
- if (typeof this._resultCallback == "function") {
- if (typeof err == "undefined") {
- err = this._error();
- }
- this._resultCallback(result, err);
- }
- },
- _testModeNotify: function(charge) {
- var self = this;
- if (charge['channel'] == channels.wx_pub) {
- var dopay = confirm("模拟付款?");
- if (dopay) {
- var request = new XMLHttpRequest();
- request.open('GET', cfg.PINGPP_NOTIFY_URL+charge['id']+'?livemode=false', true);
- request.onload = function() {
- if (request.status >= 200 && request.status < 400 && request.responseText == "success"){
- self._innerCallback("success");
- } else {
- var extra = 'http_code:'+request.status+';response:'+request.responseText;
- self._innerCallback("fail", self._error("testmode_notify_fail", extra));
- }
- };
- request.onerror = function() {
- self._innerCallback("fail", self._error("network_err"));
- };
- request.send();
- } else {
- self._innerCallback("cancel");
- }
- } else {
- var params = {
- 'ch_id': charge['id'],
- 'scheme': 'http',
- 'channel': charge['channel']
- };
- if (hasOwn.call(charge, 'order_no')) {
- params['order_no'] = charge['order_no'];
- }
- if (hasOwn.call(charge, 'extra')) {
- params['extra'] = encodeURIComponent(JSON.stringify(charge['extra']));
- }
- location.href = cfg.PINGPP_MOCK_URL+'?'+stringify_data(params);
- }
- }
- };
- function form_submit(url, method, params) {
- var form = document.createElement("form");
- form.setAttribute("method", method);
- form.setAttribute("action", url);
- for (var key in params) {
- if (hasOwn.call(params, key)) {
- var hiddenField = document.createElement("input");
- hiddenField.setAttribute("type", "hidden");
- hiddenField.setAttribute("name", key);
- hiddenField.setAttribute("value", params[key]);
- form.appendChild(hiddenField);
- }
- }
- document.body.appendChild(form);
- form.submit();
- }
- function stringify_data(data, channel, urlencode) {
- if (typeof urlencode == "undefined") {
- urlencode = false;
- }
- var output = [];
- for (var i in data) {
- if (channel == "bfb_wap" && i == "url") {
- continue;
- }
- if (channel == "yeepay_wap" && i == "mode") {
- continue;
- }
- output.push(i + '=' + (urlencode ? encodeURIComponent(data[i]) : data[i]));
- }
- return output.join('&');
- }
- PingppSDK.prototype.payment = PingppSDK.prototype.createPayment;
- window.pingpp = new PingppSDK();
- // aliases
- window.PINGPP_PAY_SDK = window.PINGPP_WX_PUB = window.pingpp;
- })();
|