Configure Alipay and WeChat Pay on Xstore

Using Oracle EFTLink, you can configure Alipay and WeChat Pay payments in Xstore for payment terminals with an integrated barcode scanner.
These instructions are based on a new installation of Xstore. Please work with your systems integrator to determine how to best install and configure this feature within your systems.
Oracle EFTLink does not officially support Alipay or WeChat Pay as payment methods. To enable these payment methods, “PreAuthorisation” and "FinancialAdvice" requestTypes are used. The sample request shown below, if sent to EFTLink, would initiate an Alipay transaction.
<CardServiceRequest RequestType="FinancialAdvice" ApplicationSender="XSTORE" WorkstationID="1" RequestID="5"> <POSdata LanguageCode="eng"> <POSTimeStamp>2018-06-26T12:09:12</POSTimeStamp> <TransactionNumber>53</TransactionNumber> </POSdata> <TotalAmount Currency="USD">1.00</TotalAmount> </CardServiceRequest>
Prerequisites
  • Download and install the latest version of the EFTLink Cybersource Core. Alipay is supported, starting with version 2.7. WeChat Pay is supported, starting with version 2.21.
  • Alipay and WeChat Pay must be enabled on both Cybersource Payworks MIDs. Please contact your Cybersource representative to get these payment methods activated.
Configure Alipay and WeChat Pay Payments
1. Add Alipay and WeChat Pay as Tender Option in the Xstore Backoffice or directly edit Tables
TND_TNDR
,
TND_TNDR_AVAILABILITY
,
TND_TNDR_OPTIONS
,
TND_TNDR_TYPCODE
, and
TND_TNDR_USER_SETTINGS
to include new tenders called "ALIPAY" and "WECHATPAY".
In TND_TNDR_OPTIONS, set the AUTH_MTHD_CODE to EFT_LINK_ALIPAY for Alipay, and to EFT_LINK_WECHATPAY for WeChat Pay.
You can use the SQL shown below:
-- Alipay Insert into DTV.TND_TNDR (ORGANIZATION_ID,TNDR_ID,TNDR_TYPCODE,CURRENCY_ID,DESCRIPTION,DISPLAY_ORDER,FLASH_SALES_DISPLAY_ORDER,DISABLED_FLAG,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','CREDIT_CARD','*','_ALIPAY',null,170,0,to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','CASH_DRAWER_REPORT',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','LAYAWAY',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','ONHOLD',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','ORDER',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','PRESALE',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','RETURN_WITHOUT_RECEIPT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','RETURN_WITH_GIFT_RECEIPT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','RETURN_WITH_RECEIPT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','SALE',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','SEND_SALE',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','SPECIAL_ORDER',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','TILL_COUNT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_OPTIONS (ORGANIZATION_ID,TNDR_ID,CONFIG_ELEMENT,AUTH_MTHD_CODE,SERIAL_ID_NBR_REQ_FLAG,AUTH_REQ_FLAG,AUTH_EXPR_DATE_REQ_FLAG,PIN_REQ_FLAG,CUST_SIG_REQ_FLAG,ENDORSEMENT_REQ_FLAG,OPEN_CASH_DRAWER_REQ_FLAG,UNIT_COUNT_REQ_CODE,MAG_SWIPE_READER_REQ_FLAG,DFLT_TO_AMT_DUE_FLAG,MIN_DENOMINATION_AMT,REPORTING_GROUP,EFFECTIVE_DATE,EXPR_DATE,MIN_DAYS_FOR_RETURN,MAX_DAYS_FOR_RETURN,CUST_ID_REQ_CODE,CUST_ASSOCIATION_FLAG,POPULATE_SYSTEM_COUNT_FLAG,INCLUDE_IN_TYPE_COUNT_FLAG,SUGGESTED_DEPOSIT_THRESHOLD,SUGGEST_DEPOSIT_FLAG,CHANGE_TNDR_ID,CASH_CHANGE_LIMIT,OVER_TENDER_OVERRIDABLE_FLAG,NON_VOIDABLE_FLAG,DISALLOW_SPLIT_TNDR_FLAG,CLOSE_COUNT_DISC_THRESHOLD,CID_MSR_REQ_FLAG,CID_KEYED_REQ_FLAG,POSTAL_CODE_REQ_FLAG,POST_VOID_OPEN_DRAWER_FLAG,CHANGE_ALLOWED_WHEN_FOREIGN,FISCAL_TNDR_ID,ROUNDING_MODE,ASSIGN_CASH_DRAWER_REQ_FLAG,POST_VOID_ASSIGN_DRAWER_FLAG,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','*','EFT_LINK_ALIPAY',1,1,1,0,0,0,0,'TOTAL_NORMAL',0,1,null,'TENDER SUMMARY',null,null,0,30,null,0,0,1,1000,0,'LOCAL_CURRENCY',999999,0,0,0,null,0,0,0,0,0,null,null,0,0,to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_USER_SETTINGS (ORGANIZATION_ID,TNDR_ID,GROUP_ID,USAGE_CODE,ENTRY_MTHD_CODE,CONFIG_ELEMENT,ONLINE_FLOOR_APPROVAL_AMT,ONLINE_CEILING_APPROVAL_AMT,OVER_TNDR_LIMIT,OFFLINE_FLOOR_APPROVAL_AMT,OFFLINE_CEILING_APPROVAL_AMT,MIN_ACCEPT_AMT,MAX_ACCEPT_AMT,MAX_REFUND_WITH_RECEIPT,MAX_REFUND_WO_RECEIPT,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','CASHIER','DEFAULT','DEFAULT','*',1,null,0,null,null,0.01,5000,1000,1000,to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_USER_SETTINGS (ORGANIZATION_ID,TNDR_ID,GROUP_ID,USAGE_CODE,ENTRY_MTHD_CODE,CONFIG_ELEMENT,ONLINE_FLOOR_APPROVAL_AMT,ONLINE_CEILING_APPROVAL_AMT,OVER_TNDR_LIMIT,OFFLINE_FLOOR_APPROVAL_AMT,OFFLINE_CEILING_APPROVAL_AMT,MIN_ACCEPT_AMT,MAX_ACCEPT_AMT,MAX_REFUND_WITH_RECEIPT,MAX_REFUND_WO_RECEIPT,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','MANAGER','SALE','DEFAULT','*',1,null,0,null,null,0.01,5000,1000,1000,to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_USER_SETTINGS (ORGANIZATION_ID,TNDR_ID,GROUP_ID,USAGE_CODE,ENTRY_MTHD_CODE,CONFIG_ELEMENT,ONLINE_FLOOR_APPROVAL_AMT,ONLINE_CEILING_APPROVAL_AMT,OVER_TNDR_LIMIT,OFFLINE_FLOOR_APPROVAL_AMT,OFFLINE_CEILING_APPROVAL_AMT,MIN_ACCEPT_AMT,MAX_ACCEPT_AMT,MAX_REFUND_WITH_RECEIPT,MAX_REFUND_WO_RECEIPT,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'ALIPAY','EVERYONE','SALE','DEFAULT','*',1,null,0,null,null,0.01,5000,1000,1000,to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); -- WechatPay Insert into DTV.TND_TNDR (ORGANIZATION_ID,TNDR_ID,TNDR_TYPCODE,CURRENCY_ID,DESCRIPTION,DISPLAY_ORDER,FLASH_SALES_DISPLAY_ORDER,DISABLED_FLAG,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','CREDIT_CARD','*','_WECHATPAY',null,170,0,to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','CASH_DRAWER_REPORT',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','LAYAWAY',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','ONHOLD',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','ORDER',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','PRESALE',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','RETURN_WITHOUT_RECEIPT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','RETURN_WITH_GIFT_RECEIPT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','RETURN_WITH_RECEIPT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','SALE',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','SEND_SALE',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','SPECIAL_ORDER',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_AVAILABILITY (ORGANIZATION_ID,TNDR_ID,AVAILABILITY_CODE,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','TILL_COUNT',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_OPTIONS (ORGANIZATION_ID,TNDR_ID,CONFIG_ELEMENT,AUTH_MTHD_CODE,SERIAL_ID_NBR_REQ_FLAG,AUTH_REQ_FLAG,AUTH_EXPR_DATE_REQ_FLAG,PIN_REQ_FLAG,CUST_SIG_REQ_FLAG,ENDORSEMENT_REQ_FLAG,OPEN_CASH_DRAWER_REQ_FLAG,UNIT_COUNT_REQ_CODE,MAG_SWIPE_READER_REQ_FLAG,DFLT_TO_AMT_DUE_FLAG,MIN_DENOMINATION_AMT,REPORTING_GROUP,EFFECTIVE_DATE,EXPR_DATE,MIN_DAYS_FOR_RETURN,MAX_DAYS_FOR_RETURN,CUST_ID_REQ_CODE,CUST_ASSOCIATION_FLAG,POPULATE_SYSTEM_COUNT_FLAG,INCLUDE_IN_TYPE_COUNT_FLAG,SUGGESTED_DEPOSIT_THRESHOLD,SUGGEST_DEPOSIT_FLAG,CHANGE_TNDR_ID,CASH_CHANGE_LIMIT,OVER_TENDER_OVERRIDABLE_FLAG,NON_VOIDABLE_FLAG,DISALLOW_SPLIT_TNDR_FLAG,CLOSE_COUNT_DISC_THRESHOLD,CID_MSR_REQ_FLAG,CID_KEYED_REQ_FLAG,POSTAL_CODE_REQ_FLAG,POST_VOID_OPEN_DRAWER_FLAG,CHANGE_ALLOWED_WHEN_FOREIGN,FISCAL_TNDR_ID,ROUNDING_MODE,ASSIGN_CASH_DRAWER_REQ_FLAG,POST_VOID_ASSIGN_DRAWER_FLAG,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','*','EFT_LINK_WECHATPAY',1,1,1,0,0,0,0,'TOTAL_NORMAL',0,1,null,'TENDER SUMMARY',null,null,0,30,null,0,0,1,1000,0,'LOCAL_CURRENCY',999999,0,0,0,null,0,0,0,0,0,null,null,0,0,to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.06.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_USER_SETTINGS (ORGANIZATION_ID,TNDR_ID,GROUP_ID,USAGE_CODE,ENTRY_MTHD_CODE,CONFIG_ELEMENT,ONLINE_FLOOR_APPROVAL_AMT,ONLINE_CEILING_APPROVAL_AMT,OVER_TNDR_LIMIT,OFFLINE_FLOOR_APPROVAL_AMT,OFFLINE_CEILING_APPROVAL_AMT,MIN_ACCEPT_AMT,MAX_ACCEPT_AMT,MAX_REFUND_WITH_RECEIPT,MAX_REFUND_WO_RECEIPT,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','CASHIER','DEFAULT','DEFAULT','*',1,null,0,null,null,0.01,5000,1000,1000,to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_USER_SETTINGS (ORGANIZATION_ID,TNDR_ID,GROUP_ID,USAGE_CODE,ENTRY_MTHD_CODE,CONFIG_ELEMENT,ONLINE_FLOOR_APPROVAL_AMT,ONLINE_CEILING_APPROVAL_AMT,OVER_TNDR_LIMIT,OFFLINE_FLOOR_APPROVAL_AMT,OFFLINE_CEILING_APPROVAL_AMT,MIN_ACCEPT_AMT,MAX_ACCEPT_AMT,MAX_REFUND_WITH_RECEIPT,MAX_REFUND_WO_RECEIPT,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','MANAGER','SALE','DEFAULT','*',1,null,0,null,null,0.01,5000,1000,1000,to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null); Insert into DTV.TND_TNDR_USER_SETTINGS (ORGANIZATION_ID,TNDR_ID,GROUP_ID,USAGE_CODE,ENTRY_MTHD_CODE,CONFIG_ELEMENT,ONLINE_FLOOR_APPROVAL_AMT,ONLINE_CEILING_APPROVAL_AMT,OVER_TNDR_LIMIT,OFFLINE_FLOOR_APPROVAL_AMT,OFFLINE_CEILING_APPROVAL_AMT,MIN_ACCEPT_AMT,MAX_ACCEPT_AMT,MAX_REFUND_WITH_RECEIPT,MAX_REFUND_WO_RECEIPT,CREATE_DATE,CREATE_USER_ID,UPDATE_DATE,UPDATE_USER_ID,RECORD_STATE) values (1000,'WECHATPAY','EVERYONE','SALE','DEFAULT','*',1,null,0,null,null,0.01,5000,1000,1000,to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',to_timestamp('14-JUL-17 03.34.07.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'),'BASEDATA',null);
2. Add Alipay and WeChat Pay in Tender Menu
In
MenuConfig.xml
, add a menu option to menu
SALE::TENDER_OPTIONS
:
<MenuOption ref="SALE::TENDER_ALIPAY" text="Alipay"/> <MenuOption ref="SALE::TENDER_WECHATPAY" text="WeChat Pay"/>
3. Add OpChain
In OpChainConfig.xml, add the OpChains:
<OpChain name="TENDER_ALIPAY" signal="TransactionModified" contextKey="SALE_TENDER_EMPTY_MENU_OPTION"> <Op class="dtv.pos.tender.DefaultCreateTenderLineItemOp"> <Parameter name="TenderStatus" value="Tender" /> <Parameter name="TenderCategory" value="ALIPAY" /> <Parameter name="TenderId" value="ALIPAY" /> </Op> <PromptOp class="dtv.pos.tender.PromptCustAsscRequiredForTenderOp" /> <Op class="dtv.pos.tender.check.PromptIdentityVerificationOp" /> <PromptOp class="dtv.pos.tender.DefaultPromptTenderAmtOp" validationsBean="tenderAmountRules" /> <Op class="dtv.pos.tender.AddTenderToSaleTranOp" /> <Op class="dtv.pos.tender.rounding.UpdateTransactionRoundedAmountOp" /> <Op class="dtv.tenderauth.impl.eftlink.op.EftLinkAuthorizeOp" /> <Op class="dtv.pos.common.PersistTranInProcessOp" /> <OpChainRoute chainKey="CAPTURE_SALE_TENDER_SIGNATURE" /> <Op class="dtv.pos.assistance.NotifyTrainingTenderAuthOp" /> <OpChainRoute chainKey="CHECK_SALE_COMPLETE" chainType="START" /> </OpChain> <OpChain name="TENDER_WECHATPAY" signal="TransactionModified" contextKey="SALE_TENDER_EMPTY_MENU_OPTION"> <Op class="dtv.pos.tender.DefaultCreateTenderLineItemOp"> <Parameter name="TenderStatus" value="Tender" /> <Parameter name="TenderCategory" value="WECHATPAY" /> <Parameter name="TenderId" value="WECHATPAY" /> </Op> <PromptOp class="dtv.pos.tender.PromptCustAsscRequiredForTenderOp" /> <Op class="dtv.pos.tender.check.PromptIdentityVerificationOp" /> <PromptOp class="dtv.pos.tender.DefaultPromptTenderAmtOp" validationsBean="tenderAmountRules" /> <Op class="dtv.pos.tender.AddTenderToSaleTranOp" /> <Op class="dtv.pos.tender.rounding.UpdateTransactionRoundedAmountOp" /> <Op class="dtv.tenderauth.impl.eftlink.op.EftLinkAuthorizeOp" /> <Op class="dtv.pos.common.PersistTranInProcessOp" /> <OpChainRoute chainKey="CAPTURE_SALE_TENDER_SIGNATURE" /> <Op class="dtv.pos.assistance.NotifyTrainingTenderAuthOp" /> <OpChainRoute chainKey="CHECK_SALE_COMPLETE" chainType="START" /> </OpChain>
4. Add ActionConfig
In ActionConfig.xml, add:
<Action name="SALE::TENDER_ALIPAY" category="Register" keywords="sale_tender" text="_menutext33" chainKey="TENDER_ALIPAY"> <IconGroup icon="_imageTenderAlipay" rollIcon="_imageTenderAlipayRoll" pressIcon="_imageTenderAlipayPress" disabledIcon="_imageTenderAlipayDisabled" /> <VisibilityRule class="dtv.pos.shared.visibilityrules.TenderEnabledCheck" > <Parameter name="tender" value="ALIPAY" /> </VisibilityRule> <VisibilityRule class="dtv.pos.shared.visibilityrules.EffectiveTenderAccCheck" > <Parameter name="tender" value="ALIPAY" /> </VisibilityRule> <VisibilityRule class="dtv.pos.shared.visibilityrules.AvailableLayawayTenderAccCheck" > <Parameter name="tender" value="ALIPAY" /> </VisibilityRule> <VisibilityRule class="dtv.pos.register.sale.AmountDueVisibilityRule" /> </Action> <Action name="SALE::TENDER_WECHATPAY" category="Register" keywords="sale_tender" text="_menutext33" chainKey="TENDER_WECHATPAY"> <IconGroup icon="_imageTenderWechatpay" rollIcon="_imageTenderWechatpayRoll" pressIcon="_imageTenderWechatpayPress" disabledIcon="_imageTenderWechatpayDisabled" /> <VisibilityRule class="dtv.pos.shared.visibilityrules.TenderEnabledCheck" > <Parameter name="tender" value="WECHATPAY" /> </VisibilityRule> <VisibilityRule class="dtv.pos.shared.visibilityrules.EffectiveTenderAccCheck" > <Parameter name="tender" value="WECHATPAY" /> </VisibilityRule> <VisibilityRule class="dtv.pos.shared.visibilityrules.AvailableLayawayTenderAccCheck" > <Parameter name="tender" value="WECHATPAY" /> </VisibilityRule> <VisibilityRule class="dtv.pos.register.sale.AmountDueVisibilityRule" /> </Action>
5. Add translations
In translation.properties, add a line:
_ALIPAY=Alipay _WECHATPAY=WeChat Pay
6. Configure Icons
In ui.properties, add the lines:
_imageTenderAlipay=C:/xstore/cust_config/version1/apmbuttons/icon-tender-alipay.png _imageTenderAlipayRoll=C:/xstore/cust_config/version1/apmbuttons/icon-tender-alipay-hover.png _imageTenderAlipayPress=C:/xstore/cust_config/version1/apmbuttons/icon-tender-alipay-press.png _imageTenderAlipayDisabled=C:/xstore/cust_config/version1/apmbuttons/icon-tender-alipay-disabled.png _imageTenderWechatpay=C:/xstore/cust_config/version1/apmbuttons/icon-tender-wechatpay.png _imageTenderWechatpayRoll=C:/xstore/cust_config/version1/apmbuttons/icon-tender-wechatpay-hover.png _imageTenderWechatpayPress=C:/xstore/cust_config/version1/apmbuttons/icon-tender-wechatpay-press.png _imageTenderWechatpayDisabled=C:/xstore/cust_config/version1/apmbuttons/icon-tender-wechatpay-disabled.png
7. Configure Auth Process
Add the following to AuthConfig.xml:
<AuthProcess name="EFT_LINK_ALIPAY" extends="EFT_LINK_CREDIT"> </AuthProcess> <AuthRequestMap name="EFT_LINK_ALIPAY" extends="EFT_LINK_CREDIT"> <AuthRequest key="TENDER" class="dtv.tenderauth.impl.eftlink.request.EftLinkCreditDebitRequest" enabled="true"> <parameter name="TerminalID" ref="TerminalID" /> <!-- RequestType directly maps to the request types EpsRequest class --> <parameter name="RequestType" value="FINANCIAL_ADVICE" /> </AuthRequest> </AuthRequestMap> <AuthProcess name="EFT_LINK_WECHATPAY" extends="EFT_LINK_CREDIT"> </AuthProcess> <AuthRequestMap name="EFT_LINK_WECHATPAY" extends="EFT_LINK_CREDIT"> <AuthRequest key="TENDER" class="dtv.tenderauth.impl.eftlink.request.EftLinkCreditDebitRequest" enabled="true"> <parameter name="TerminalID" ref="TerminalID" /> <!-- RequestType directly maps to the request types EpsRequest class --> <parameter name="RequestType" value="PREAUTHORISATION" /> </AuthRequest> </AuthRequestMap>
8. Edit CardRange.xml
Add the following to CardRange.xml:
<Range Match="ALIPAY" Name="ALIPAY" Core="0" CardType="77"/> <Range Match="WECHATPAY" Name="WECHATPAY" Core="0" CardType="77"/>
Sample Files
If the files mentioned in the steps above are not accessible/configurable for you, you can use the sample files here. Unzip, and save the files into
cust_config/version1/
in your Xstore folder.
Refunds
Alipay and WeChat Pay refunds are supported with the following limitations:
  • The refund request is within 1 year of the payment.
  • The refund request is made against the same store as the payment.
Standalone refunds are not supported for Alipay or WeChat Pay.
Multiple partial refunds are supported, provided the total refund amount is less than, or equal to, the original payment.
Testing
You should now be able to start a transaction by selecting "Alipay" or "WeChat Pay" as tender.
It is recommend that testing be done in the Production (LIVE) environment.
The TEST environment can be used for integration purposes, with amount values of < 200.00 resulting in a successful transaction, and amount value of 201.00 resulting in a failure. In the TEST environment everything is sent to a simulator, so there is no interaction with the schemes.
You can generate a payment barcode by downloading the Alipay / WeChat Pay apps onto your mobile phone.
Related Links