Nav apraksta

paypal-express-checkout.js 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /**
  2. * This PaypalExpressCheckout global is included by wp_enqueue_script( 'paypal-express-checkout' );
  3. * It handles communication with Paypal Express checkout and public-api.wordpress.com for the purposes
  4. * of simple-payments module.
  5. */
  6. /* global paypal, jQuery */
  7. /* exported PaypalExpressCheckout */
  8. var PaypalExpressCheckout = {
  9. primaryCssClassName: 'jetpack-simple-payments',
  10. messageCssClassName: 'jetpack-simple-payments-purchase-message',
  11. wpRestAPIHost: 'https://public-api.wordpress.com',
  12. wpRestAPIVersion: '/wpcom/v2',
  13. getEnvironment: function () {
  14. if (
  15. localStorage &&
  16. localStorage.getItem &&
  17. localStorage.getItem( 'simple-payments-env' ) === 'sandbox'
  18. ) {
  19. return 'sandbox';
  20. }
  21. return 'production';
  22. },
  23. getCreatePaymentEndpoint: function ( blogId ) {
  24. return (
  25. PaypalExpressCheckout.wpRestAPIHost +
  26. PaypalExpressCheckout.wpRestAPIVersion +
  27. '/sites/' +
  28. blogId +
  29. '/simple-payments/paypal/payment'
  30. );
  31. },
  32. getExecutePaymentEndpoint: function ( blogId, paymentId ) {
  33. return (
  34. PaypalExpressCheckout.wpRestAPIHost +
  35. PaypalExpressCheckout.wpRestAPIVersion +
  36. '/sites/' +
  37. blogId +
  38. '/simple-payments/paypal/' +
  39. paymentId +
  40. '/execute'
  41. );
  42. },
  43. getNumberOfItems: function ( field, enableMultiple ) {
  44. if ( enableMultiple !== '1' ) {
  45. return 1;
  46. }
  47. var numberField = document.getElementById( field );
  48. if ( ! numberField ) {
  49. return 1;
  50. }
  51. var number = Number( numberField.value );
  52. if ( isNaN( number ) ) {
  53. return 1;
  54. }
  55. return number;
  56. },
  57. /**
  58. * Get the DOM element-placeholder used to show message
  59. * about the transaction. If it doesn't exist then the function will create a new one.
  60. *
  61. * @param string domId id of the payment button placeholder
  62. * @return Element the dom element to print the message
  63. */
  64. getMessageContainer: function ( domId ) {
  65. return document.getElementById( domId + '-message-container' );
  66. },
  67. /**
  68. * Show a messange close to the Paypal button.
  69. * Use this function to give feedback to the user according
  70. * to the transaction result.
  71. *
  72. * @param {String} message message to show
  73. * @param {String} domId paypal-button element dom identifier
  74. * @param {Boolean} [error] defines if it's a message error. Not TRUE as default.
  75. */
  76. showMessage: function ( message, domId, isError ) {
  77. var domEl = PaypalExpressCheckout.getMessageContainer( domId );
  78. // set css classes
  79. var cssClasses = PaypalExpressCheckout.messageCssClassName + ' show ';
  80. cssClasses += isError ? 'error' : 'success';
  81. // show message 1s after PayPal popup is closed
  82. setTimeout( function () {
  83. domEl.innerHTML = message;
  84. domEl.setAttribute( 'class', cssClasses );
  85. }, 1000 );
  86. },
  87. showError: function ( message, domId ) {
  88. PaypalExpressCheckout.showMessage( message, domId, true );
  89. },
  90. processErrorMessage: function ( errorResponse ) {
  91. var error = errorResponse ? errorResponse.responseJSON : null;
  92. var defaultMessage = 'There was an issue processing your payment.';
  93. if ( ! error ) {
  94. return '<p>' + defaultMessage + '</p>';
  95. }
  96. if ( error.additional_errors ) {
  97. var messages = [];
  98. error.additional_errors.forEach( function ( additionalError ) {
  99. if ( additionalError.message ) {
  100. messages.push( '<p>' + additionalError.message.toString() + '</p>' );
  101. }
  102. } );
  103. return messages.join( '' );
  104. }
  105. return '<p>' + ( error.message || defaultMessage ) + '</p>';
  106. },
  107. processSuccessMessage: function ( successResponse ) {
  108. var message = successResponse.message;
  109. var defaultMessage = 'Thank you. Your purchase was successful!';
  110. if ( ! message ) {
  111. return '<p>' + defaultMessage + '</p>';
  112. }
  113. return '<p>' + message + '</p>';
  114. },
  115. cleanAndHideMessage: function ( domId ) {
  116. var domEl = PaypalExpressCheckout.getMessageContainer( domId );
  117. domEl.setAttribute( 'class', PaypalExpressCheckout.messageCssClassName );
  118. domEl.innerHTML = '';
  119. },
  120. renderButton: function ( blogId, buttonId, domId, enableMultiple ) {
  121. var env = PaypalExpressCheckout.getEnvironment();
  122. if ( ! paypal ) {
  123. throw new Error( 'PayPal module is required by PaypalExpressCheckout' );
  124. }
  125. var buttonDomId = domId + '_button';
  126. paypal.Button.render(
  127. {
  128. env: env,
  129. commit: true,
  130. style: {
  131. label: 'pay',
  132. shape: 'rect',
  133. color: 'silver',
  134. fundingicons: true,
  135. },
  136. payment: function () {
  137. PaypalExpressCheckout.cleanAndHideMessage( domId );
  138. var payload = {
  139. number: PaypalExpressCheckout.getNumberOfItems( domId + '_number', enableMultiple ),
  140. buttonId: buttonId,
  141. env: env,
  142. };
  143. return new paypal.Promise( function ( resolve, reject ) {
  144. jQuery
  145. .post( PaypalExpressCheckout.getCreatePaymentEndpoint( blogId ), payload )
  146. .done( function ( paymentResponse ) {
  147. if ( ! paymentResponse ) {
  148. PaypalExpressCheckout.showError(
  149. PaypalExpressCheckout.processErrorMessage(),
  150. domId
  151. );
  152. return reject( new Error( 'server_error' ) );
  153. }
  154. resolve( paymentResponse.id );
  155. } )
  156. .fail( function ( paymentError ) {
  157. var paymentErrorMessage = PaypalExpressCheckout.processErrorMessage( paymentError );
  158. PaypalExpressCheckout.showError( paymentErrorMessage, domId );
  159. var code =
  160. paymentError.responseJSON && paymentError.responseJSON.code
  161. ? paymentError.responseJSON.code
  162. : 'server_error';
  163. reject( new Error( code ) );
  164. } );
  165. } );
  166. },
  167. onAuthorize: function ( onAuthData ) {
  168. var payload = {
  169. buttonId: buttonId,
  170. payerId: onAuthData.payerID,
  171. env: env,
  172. };
  173. return new paypal.Promise( function ( resolve, reject ) {
  174. jQuery
  175. .post(
  176. PaypalExpressCheckout.getExecutePaymentEndpoint( blogId, onAuthData.paymentID ),
  177. payload
  178. )
  179. .done( function ( authResponse ) {
  180. if ( ! authResponse ) {
  181. PaypalExpressCheckout.showError(
  182. PaypalExpressCheckout.processErrorMessage(),
  183. domId
  184. );
  185. return reject( new Error( 'server_error' ) );
  186. }
  187. PaypalExpressCheckout.showMessage(
  188. PaypalExpressCheckout.processSuccessMessage( authResponse ),
  189. domId
  190. );
  191. resolve();
  192. } )
  193. .fail( function ( authError ) {
  194. var authErrorMessage = PaypalExpressCheckout.processErrorMessage( authError );
  195. PaypalExpressCheckout.showError( authErrorMessage, domId );
  196. var code =
  197. authError.responseJSON && authError.responseJSON.code
  198. ? authError.responseJSON.code
  199. : 'server_error';
  200. reject( new Error( code ) );
  201. } );
  202. } );
  203. },
  204. },
  205. buttonDomId
  206. );
  207. },
  208. };